본문 바로가기

Rookies 9기/애플리케이션 보안

애플리케이션 보안 3일차

728x90

Web Shell

관리자가 SSH, FTP를 이용하지 않고 웹 브라우저로 웹 서버를 관리하기 위한 도구

공격자들이 웹쉘을 웹 서버에 업로드해서 원격으로 조종이 가능하다.

 

대응 방법

1. 웹쉘을 업로드하지 못하게 해야 한다.

2. 업로드된 웹쉘은 동작하지 못하도록 해야 한다. (압축해서 보관, 읽기만 가능한 스토리지 보관)

3. 업로드한 웹쉘의 위치를 찾을 수 없도록 위치 경로를 알려주지 않거나 파일 이름을 바꾼다.

4. 웹쉘 대응 보안 솔루션을 배치한다.

ex) 웹쉘의 Content-Type은 text/plain이지만, Proxy 도구(Burp Suite)를 이용해서 image/jpeg라고 속인다.

=> Clinet가 보내는 정보를 그대로 신뢰하는 경우, 실제 들어있는 파일은 다른 것(웹쉘) 임

 

• Web Shell 실습

Web Shell 에 사용할 홈페이지(강사님 제공)

강사님이 제공해주신 홈페이지로 실습을 한다.

웹 서버 루트 디렉토리

http://192.168.5.141/uploadfile/browser/jsp 주소로 이동을 하면 웹 서버의 루트 디렉터리로 이동을 할 수 있다.

 

•Deface 실습

Deface이란 웹 사이트의 첫 페이지를 바꾸는 공격이다. 

이미지 사진

Deface실습을 위한 이미지를 다운로드한다. (아무거나 사용 가능)

웹 서버 디렉토리
웹 서버에 업로드

hacker.jpg 파일을 웹 서버 루트 디렉터리에 업로드를 한다.

index.jsp 화면
index.jsp 수정

index.jsp 파일에 들어가 Body 부분에  <DIV style="position:absolute; left:200; top:90; Z-index:2;"> <img src="hacker.jpg"></DIV> 스크립트를 넣어준다.

결과화면

그 결과 Deface 공격이 성공했다는 걸 확인할 수 있다.

 

• SQL 인젝션 실습

 

로그인을 할 수 있는가?(ID만 알았을때)

자유게시판

로그인을 하려면 먼저 계정을 알아야 한다. 자유게시판을 가보니 webmaster라는 계정이 있다. 이 계정을 이용해 로그인을 해보자. 

 

로그인 화면

SQL 인젝션 코드를 PW에 입력을 한다.

PW 부분에 인젝션 코드 넣기
' or 1=1 --
' or 2>1 --
' or 'a'='a' -- // 숫자가 아닌 문자인 경우에는 ' '를 사용해야 함
' or 'a'='a // 주석을 사용하지 않고, '의 개수를 예상대로 맞춤 (짝수면 주석 불필요)

로그인

로그인되었다는 메시지를 볼 수 있다.

로그인이 되었지만 webmaster가 아닌 superman으로 로그인이 되었다.

superman으로 로그인 된 이유
user table의 맨 위에 있는 계정이 superman이기 때문이다.
정확하게 지정되지 않는 경우 테이블의 맨 위의 레코드(row)로 매칭된다.
즉, webmaster를 입력하지 않아도 되지만 DB테이블에 있는 계정으로 입력은 해야하기 때문이다.
webmaster로 로그인 하려면?

로그인창

ID부분에 webmaster' and 1=1-- 구문을 넣어준다.

PW부분에는 아무 문자를 입력을 해도 된다( --때문에 주석 처리가 된다.)

예상 SQL 문은  select id, pw from???? where id='webmaster' and 1=1 --' and pw=' ';이다.

 

로그인 결과

webmaster로 로그인이 되었다.

webmaster 비번을 1234로 바꿀수 있을까?

 ID 부분에 '; update tbl_member set passwd='1234' where userid='webmaster'; -- 구문을 입력해 준다.

예상 SQL 문은 select userid, passwd from tbl_member where userid=''; update tbl_member set passwd='1234' where userid='webmaster'; --' and passwd=' ';이다.

 

 

- Blind SQL Injection

DB구조 등을 모르는 상태에서 SQL 인젝션을 하는 것이다. SQL 문이 거짓이 되면 에러 메시지가 발생이 되면서 DB이름, 테이블 이름 , 컬럼 이름 등을 알아낼 수 있다.

로그인 창

로그인 창에 'having 1=1-- 을 입력 시 에러가 나온다. (having을 사용하려면 앞에 group by가 있어야 한다.)

에러 페이지

에러 페이지를 보면 tbl_member.uid, tbl_member.userid, tbl_member.passwd, tbl_member.username 이런 식으로 테이블명, 컬럼명을 알 수가 있다.

 

• DVWA 실습(Web Shell) low 단계

file Upload 실습 LOW 단계

웹쉘을 올리면 실행이 되는지 확인해보자.

 

업로드

웹쉘 파일(강사님이 제공해주심)을 업로드하니../../hackable/uploads/qsd-php-backdoor.php 에 올라갔다는 경로가 표시가 되었다.(../는 한수 준 위로 올라가라는 의미이다.)

 

경로 이동

URL창에 ../../(두 수준 올린다) http://192.168.5.128/dvwa/hackable/uploads/qsd-php-backdoor.php 경로로 이동을 한다.

웹쉘

웹쉘이 실행이 된 걸 확인할 수 있다.

Execute shell command 에 리눅스 명령을 넣으면 실행 된다. : pwd, cat /etc/passwd, ls -l, cat /etc/apache2/apache2.conf 등

 

• DVWA 실습(Web Shell) medium 단계

file Upload medium 단계

웹쉘 파일을 업로드하면 이미지가 아니라고 메시지가 출력이 된다.

Burp Suite

Proxy를 이용해보자. 버프로 인터셉트한 결과 Content-Type이 text/plain이라고 되어있다.

즉, text.plain은 일반적인 평문의 글을 의미하기 때문에  이미지 타입인 image/jpeg로 수정을 하면 업로드될 거라고 예상을 한다.

 

수정 후
업로드

웹쉘 파일이 업로드되었다는 걸 확인할 수가 있다.

업로드는 웹쉘만 있는 것은 아님
직접 실행 파일을 업로드 하는 것 : 세션을 직접 연결하는 것 ----> 원격 조종을 해서 시스템에 영향을 주는 행위
대표적인 도구 : RAT (Remote Access Trojan의 줄임말) ---> Victim에 몰래 업로드 하고 원격으로 연결하는 방법 ex) Netcat (네트워크를 몰래 다니는 고양이) : nc.exe (윈도우용), nc (리눅스용)

• 백도어 방식

미리 Victim의 관리자 PW 등을 알아낸 후, Victim host에 백도어를 실행하고 Attacker는 Victim host의 Backdoor에 접근해서 연결하는 방식이다.

백도어 방식

Window2003 : Server :Victim
Ubuntu : Client : Attacker

Window2003

Server 8000 포트(-p : port)를 열고 -e(binary를 제공) cmd.exe 권한을 넘겨주겠다.

※ wine은 원래 이름은 nc.exe인데 변경해 놓았다. 

Ubuntu

열린 서버에 접속을 하면 cmd 권한을 가진 체 연결이 된 걸 확인할 수 있다.

 

- 백도어의 방식의 문제점

중간에 방화벽이 존재하기 때문에 80 포트 또는 433과 같은 포트는 미리 열어둔 포트가 아니면 접속이 불가능하다.

 

•Reverse Connection

방화벽의 특성상 내부망에서 외부망(인터넷)으로 나가는 트래픽을 막지 않는다(막으면 인터넷이 안된다)

RAT을 이용해서 내부망에서 외부망으로 연결하는 방식을 사용한다.

RAT 방식

Ubuntu : Server :Victim
Windows2003 : Client : Attacker

Ubuntu

Server는 5678 포트를 열어둔다.

windows2003

Client는 Server 주소에 들어간다.

Ubuntun

Server는 Client의 cmd 권한을 얻을 수 있다.