웹 해킹에 들어가기 앞서
웹서버를 구축할 것이다.
(취약점이 많은!)

그 취약점들을 먼저 공부해 볼 것이기 때문이다.

리눅스에서 웹서버를 구축하기 전에
리눅스의 방화벽을 전부 해제해 줄 것이다.
(실제 서버에서는 해제하면 안된다!, 하지만 우리는 공부할 것이기 때문에 해제해 주도록 한다!)

리눅스에는 방화벽이 두개가 있다.
1. iptables
2. SELinux
이렇게 두개다!

iptables를 삭제해 줄것이다.
/etc/sysconfig/iptables  를 삭제해준다.



(iptables 삭제)



SELinux를 해제해 줄것이다.

vi /etc/sysconfig/selinux 에 들어가서 (vi 편집기 이용)
SELINUX에 disabled로 고쳐준다.



(SELinux 해제)



잘 해제 되었는지 확인해본다.
iptables -L   (명령)
했을 때 체인 룰이 아무것도 안나오면 설정이 안되있는 것이다.


getenforce를 입력하였을 때
Disabled라고 나오면 해제된 것이다.


(해제 모습)



그 후 yum을 이용하여
httpd.i386
php.i386
php-mysql.i386
mysql.i386
mysql-server.i386

을 설치해준다.



(설치된 모습)



httpd를 실행시켜준다. (아파치 웹서버이다.)



(실행 모습)



netstat -ant로 확인해볼 수 있다. (웹서버 포트는 80번 포트)



(웹서버 실행중)



혹은
현재 실행중인 프로세스를 확인해서 확인할 수 도 있다.
명령어 #> ps -ef | grep httpd



(프로세스 확인)



그렇게 되면 외부 호스트에서 IP주소로 접속하였을 때
아파치 화면이 뜬다.



(아파치 화면)



이제 MySQL 실행시켜줄 것이다.
MySQL은 DB이다.

명령어 #> service mysqld start

netstat -ant로
3306이 열려있으면 실행된 것이다.



(MySQL 실행)



mysql에 접속해 보겠다.
#> mysql -u root
(처음 접속, 비밀번호 설정 안했을 때) 이렇게 들어간다.



(접속 화면)



접속이 되면
mysql>
이렇게 프롬프트가 바뀐다.

비밀번호를 설정해 주겠다.
명령어
#> mysqladmin -u root password (쓸 비밀번호)



(비밀번호 설정)



비밀번호를 설정한 후에는 접속 방법이 조금 다르다.

#> mysql -u root -p
이렇게 접속하면
비밀번호 입력하는 란이 나온다.
여기에 아까 설정해준 비밀번호를 입력하면 된다.


(비밀번호 입력 접속)



이제 제로보드를 설치할 환경이 다 갖추어 졌다.

제로보드를 /var/www/html  경로에 다운받아준다.
현재 제로보드가 tar형태이므로 풀어줄 것이다.
명령어
#> tar xvf zboard.tar



(타르 파일 풀기)




(푼 모습)



해제하고 나면 해당 경로에 디렉터리 하나와 파일 하나가 생긴다.



(풀린 모습)



여기서 /etc/php.ini  파일을 하나 고쳐줄 것이 있다.



(vi /etc/php.ini )



vi 편집기를 이용해 들어와서
아래 표시된 부분을 On으로 고친다.



(고쳐진 모습)



그 후 외부 호스트에서
IP/zboard/install.php 경로로 접속을 하면 아래와 같이 나온다.



(접속 모습)



여기서 한글이 깨지는 것을 발견할 수 있는데
웹브라우저가 인코딩을 안해주기 때문이다.
인코딩 해주는 프로그램을 추가해준다.



(인코딩 프로그램 추가)



추가해 준 후 해당 페이지에서 오른쪽 클릭을 해서
Korea 로 인코딩 눌러준다.



(Korea 클릭)



그렇게 되면 아래와 같은 화면으로 잘 나오게 된다.!






오늘은 취약점 스캐너 툴을 이용해 볼 것이다.

* 취약점 스캐너
 - nesus scanner
  : nesus는 nesus server를 이용해 취약점을 스캔한다.
  : 여러사용자가 nesus server를 이용해 취약점을 분석할 수 있다.
  : 이제 우리는 nesus server를 리눅스에 설치할 것이다.
  : 무료로 제공되는 취약점 점검 도구중에 가장 유명하다.

Nessus 스캐너는 다른 스캐너와 조금 다르다.
Nessus 서버를 만든 후 그 서버가 스캔을 하고 호스트에 결과를 알려주는 식이다.
Nessus 서버를 다른 호스트들이 이용할 수 있다.

만들어두었던 리눅스에 Nessus 서버를 설치할 것이다.



(Nessus 서버 설치)



Nessus 서버를 실행시켜 준다.



(Nessus 서버 실행)



실행되었고 8834번 포트가 열려있는 것을 확인 할 수 있다.

호스트에서 이 서버에 접속해서 사용해야한다.
window 호스트에서
https:서버아이피:8834 로 접속한다.
안전하지 않음으로 뜨는 것은 해당 브라우저가 해당 인증서가 없기 때문에
안전하지 않다고 뜨는 것일 뿐이다.



(컨티뉴 클릭)



Continue를 클릭하고
계정을 만들어야한다.
간단하게 admin으로 설정했다.



(계정설정)



그리고 Activation Code를 받아야한다.
그러기 위해서는 등록해야한다.



(Activataion 코드 입력창)



홈페이지에 들어간다!



(Get an activation 클릭)



클릭하면 회원가입창이 나오고
회원가입을 하면
적은 email주소에 Activation 코드가 온다.
그 코드를 입력해주면 된다.



(Activation 코드 입력)



들어오면 처음 화면이 아래와 같다.
Scans, Polices 화면이 있다.



(Scans 화면)





(Policies 화면)



- Scans 에서는 스캔하는 화면이고
Policies에서는 직접 정책, 룰을 설정하는 곳이다.

Policies에서 Policy를 만들어보겠다.



(기본 정책들)



기본 룰 중 Basic Network Scan으로 클릭해서
이름 등을 설정해준다.




(TEST로 설정했다.)




(Policy 생성된 모습)



이렇게 설정된 TEST Policy로 스캔을 할 수 있다.
TEST 정책에 들어가보면
세부적인 설정을 할 수 있다.




(세부 설정 모습)



이제 스캔을 해보겠다.
New Scan을 누른다.



(New Scan)



아까 만들었던 정책을 이용해도 되고
기본적으로 설정되있던 정책을 사용해도 된다.
들어오면
스캔의 이름 타겟을 적는 페이지가 나온다.
Target에는 스캔을 할 대상을 입력하면 된다.



(스캔 입력)



Save를 누르면 스캔 목록이 나온다.
여기서 재생 버튼을 클릭하면 스캔을 시작한다.



(스캔 목록)



스캔을 하는 모습이다.
다 되면 결과가 정리되서 나오지만 실시간으로도 볼 수 있다.



(분석 화면)



취약점의 심각성정도에 따라 표시도 다르게 나온다.
치명적이거나 심각한 취약점은 표시가 되어서 나온다.



(취약점 분석 화면)



추가적인 Open Source Scanner
 - GIMP
 - SAINT
 - Nikto
이런 것들이 있다. :)




오늘은 file Carving의 기초를 살짝 해볼 것이다.

* Network file Carving
 - 파일 복구
  : 깨진 파일을 복구하거나 삭제된 파일을 복구하는 것
 - 헥스 에디터 (일반적으로 우리가 다루는 문자는 텍스트 에디터이다.)
  : 16진수로 볼 수 있는 헥스 에디터이다.
  : 무료툴에서는 HxD가 좋다.

아래의 덤프 패킷에서 이미지 파일을 추출해내는 것이다.


(패킷상황)



먼저 이미지 파일을 요청한 패킷을 찾는다.



(이미지 파일 요청)



그에 해당하는 응답 패킷을 찾는다.


(응답 패킷)



이 패킷안에 이미지 파일이 들어있다.
Follow Stream해서 확인해보면



(패킷 내용)



이상한 글씨들로 써있다.
이유는 헥사 데이터들인데 이 값이 유니코드로 표현이 되다보니
정체불명의 글자들이 나오는 것이다.
여기서 헥사 데이터로 가져갈 것이다.


(저장)



(저장)



(저장 파일)



이 파일을 메모장에서 열어보면
아래와 같다.


(덤프 파일)



이 파일을 텍스트 에디터가 아닌
헥스 에디터로 열어볼 것이다.
헥스 에디터로 HxD를 쓸것이다.

HxD 검색으로 홈페이지에 들어가서 다운로드를 누른다.



(다운로드 클릭)



(한국어 버젼 클릭)



한국어 버젼을 받는다.

다운 받고 설치후 열어보면 아래와 같다.


(실행 화면)



여기에 아까 저장한 파일을 열어보겠다.


(img 파일 오픈)



헥스 데이터로 나온다.
하지만 GET부터 헤더내용 까지 들어있으므로
이미지 파일의 데이터만 뽑아 오겠다.

와이어샤크에서
이미지 파일을 헥스스트림으로 복사한다.


(헥스스트림 복사)




(이미지 파일)



이미지 파일을 열어보면 위와 같다.

맨 앞에 적혀있는 것이 파일 시그니쳐이다.
* 파일 시그니쳐( File Signiture )
 - 파일의 종류를 나타내는 고유값
 - 맨앞에 써있다.
 - 시그니쳐가 잘못되면 열리지 않는다.
 - 시그니쳐를 속일수는 없다.(반면 확장자는 속일 수 있다.)
 - 윈도우즈의 실행파일(exe) : MZ
 - 압축파일(zip) : PK
 - 이미지파일(jpg) : 0xFF 0xD8 0xFF 0xE0 (문자로 표현은 안된다.)
 - 텍스트파일(txt) : 시그니쳐가 없다. (한글,워드는 텍스트 파일이 아니다.)
   
 -> 버전에 따라 조금씩 다를 수 있다.

실행파일을 헥스에디터로 열어보겠다.



(실행파일 MZ)






여기서 아까 열었던 이미지 파일을 jpg로 저장해준다.



(저장)



(이미지파일)



이미지 파일이 생겼다.
열어보면


(이미지)



이미지가 나오는 것을 확인할 수 있다.

또 다른 방법이 있다.
파일에서 Export Object에서 HTTP를 클릭한다.



(Export Object에서 HTTP를 클릭)



(이미지파일 저장)



여기에는 주고받은 HTTP로 주고받은 내용이 나오는데
이미지를 클릭하고 저장을 누른다.


(이미지 저장)



(이미지 파일)



그렇게 되면 이미지를 와이어샤크 패킷에서 뽑아 볼 수 있다.

-----------------------------------------------------------------------------------------------




패킷분석

문제 9
악성코드에 감염된 페이지를 찾고
무엇을 하려는지 찾아내기.


(패킷 상황)



(http 패킷 필터링)



http 패킷중 이상한 패킷이 있다.
데이터 내용을 보면



(스크립트)



이상한 스크립트를 숨겨 놓은 것을 찾을 수 있다.

이 스크립트를 메모장으로 복사해서 보니


(스크립트)



알아보기 힘든 ... 코드다.. 바로 이것이 난독화!
-> 난독화기법
: 읽기 어렵게 만든것이다. 변수 이름도 이상한걸로 해놓은 것이다.
: 분석을 어렵게 만드는 것이다.

난독화코드로 악성코드를 심어놓은 해커가 이 코드가 무엇이 동작하는지 모르도록
의도한 것이다.

-----------------------------------------------------------------------------------------------
실습
attack.pcap
1. 공격 유형을 파악하시오.

2. 공격자와 피해자는 누구인가?


(attack.pcap)



Conversation을 들어가보니
공격 유형을 확인할 수 있었다.


(포트 스캔)



포트스캔이다!

그런데 좀 이상한 부분이 있다.
바로 이상한 HTTP요청들이 있었는데


(이상한 요청)




(의심스러운 요청)



이러한 요청들은 acunetix라는 취약점분석 프로그램에 의한 것이다.
그 증거는 맨 위에 acunetix라고 써있다.
즉 아래의 공격 뿐 아니라 포트 스캔도 이 프로그램으로 이루어진
자동화된 공격이라고 생각할 수 있다.

1. 공격 유형을 파악하시오.
- Port Scan
2. 공격자와 피해자는 누구인가?
- 공격자 : 192.168.0.112
- 피해자 : 65.61.137.117
-> 자동화된 점검툴(취약점점검툴) 이용




여러가지 상황에서
와이어샤크로 패킷들을 분석하고
정보를 분석해보겠다.

[ case1 ]
두 사람(베스와 베리)의 컴퓨터를 바꾸었다.
한 사람은 인터넷이 잘됬고 한 사람은 인터넷이 안된다.
그래서 네트워크 관리자에게 전화했다.
" 그러면 패킷을 덤프해서 보내주세요 "
하나는 인터넷이 잘되는 패킷덤프파일이고
하나는 인터넷이 안되는 패킷덤프파일이다.
왜 안될까?



(베스의 패킷)




(베리의 패킷)



분석
베스가 안된다.
그 이유는
1. 게이트웨이의 주소.
ARP 요청을 응답받지 못했다.
게이트웨이 주소가 잘못되었다고 추측해볼 수 있다.
-> 정확하게 얘기할 수는 없는 것이다.
    다만 추정을 하는 것이다.

[ case2 ]
- 악의적인 트래픽만을 수집해놓은 샘플이다.
공격유형과 공격자, 피해자가 누구인지 알아내자.


(case 2 패킷 화면)



SYN 패킷이 잔뜩 있는 걸로 봐서
SYN Flooding으로 예상된다.
하지만 이렇게 단정지어서는 안된다.
그렇게 결론 내리기 까지는 정확한 결과를 찾아야한다.



(static - 맨위 메뉴 선택)



(통계수치)



통계수치를 볼 수 있다.
수집된 시간은 1초동안 수집된 것이고,
1초에 19946개의 패킷이 드어온 것을 확인 할 수 있다.
Dos 공격을 의심할 만한 양의 패킷이다.

하지만 이 기준도 모호하다. 서버입장에서는
1초에 더 많은 패킷이 들어오기 때문이다.
static 메뉴에서 conversation으로 어떤 호스트와의 통신을 했는지 확인한다.


(Conversation 선택)



(Conversation 화면)



확인해보면 여러 IP에서 패킷이 들어오고 있는 것을 확인 할 수 있다.
1초에 다량의 SYN 패킷으로 SYN Flooding이라고 추정하였다.

정리하면
1. 공격 유형은 무엇인가?? 
(SYN Flooding)
-> SYN이 많다고 단순히 SYN Flooding으로 생각하면안된다.
근거를 찾아야한다.
static으로 보면 1초동안에 수집된것이라는 것을 알 수 있다.
- 1초동안 약 2만여개의 SYN 패킷이 들어왔다.
- 1초 동안에 수집된 패킷의 양이 평소보다 많이 발생했으므로 DDos 추정
-> TCP SYN Flooding
-> 여기서는 평균을 모르므로 추정하는 것이다.

2. 공격자와 피해자의 ip는 몇번인가?
- 피해자 (192.168.1.150, http서버)
- 공격자 (ip 스푸핑중이다.)

[ case3 ]
 - 악의적인 트래픽만을 수집해 높은 샘플
 - 다른 일반적인 트래픽들은 포함되어 있지 않다.
- 공격유형과 공격자, 피해자를 밝히자.



(case3 상황)



Conversation을 확인해보니
도착지 포트를 보니 포트스캔을 한 흔적이 보인다.


(Conversation 화면)



포트 스캔 중 어떤 스캔인지 확인해보기 위하여
패킷을 확인해보겠다.



(패킷 선택 확인)




(패킷 확인)



패킷을 확인하니 세션을 연결하지 않고
SYN, ACK가 오면 RST를 보내 연결을 맺지 않는 것을 확인 할 수 있었다.

이로써 공격자는 스텔스 스캔 중인 것이다.
TCP Half Scan이다.

연결되어있는 포트를 확인해보면 패킷이 3개인 것들을 보면 된다.



(연결된 포트)



정리하면
1. 공격 유형은 무엇인가?
- TCP Half Scan
2. 공격자와 피해자의 IP는 무엇인가?
 - 공격자 : 192.168.1.100
 - 피해자 : 192.168.1.101
3. 만약 공격이 성공했다면 공격자가 알아낸 정보는 무엇이 있었는지?
 - 열려있는 포트들에 대한 목록
135
80
8080
445
8888
1025
139
3306 포트가 열려있다.
설명
- 4초동안 1만여개의 포트를 확인하였으므로 자동화된 툴을 사용했을 것이다.
-> Conversations 결과를 보면 포트를 스캔했다는 사실을 알 수 있다.


[ case4 ]
 - 정상적인 트래픽과 비정상적 트래픽이 함께 존재하는 샘플이다.
 - 정상적인 트래픽과 같이 있는 상태에서 분석을 진행하기 때문에
    정상적인 트래픽과 비정상적인 트래픽을 구분할 수 있어야 한다.

그렇다면 똑같이 공격유형과 공격자, 피해자를 알아보자.


(case4 상황)



먼저 패킷의 흐름을 파악하기 위해 분석의 맨 아래 전문가 정보를 선택한다.



(전문가 정보 선택)



(정보 화면)



화면을 보면 어떤 통신을 했는지
한 눈에 정리해서 볼 수 있다.

여기서 더 내려가보니..



(의심 패킷들)



의심되는 패킷들이 보인다.
다른 통신없이 SYN패킷만 보낸 흔적이다. 그것도 포트번호만 바꾸어가면서

Conversation으로 확인해보았다.



(Conversation 확인)



Conversation으로 확인해보니
포트스캔의 흔적을 찾을 수 있었다.

정리하면
1. 공격 유형은?
 -> 포트스캔
2. 공격자와 피해자의 ip는?
- 공격자 : 192.168.1.100
- 피해자 : 124.137.25.23
3. 공격이 성공했다면 공격자가 알아낸 정보는 무엇인지?
- 25번이 열려있다는 사실.




* HTTP 패킷의 구조에서
Body가 존재하면 헤더에는
content-type
content size 이 반드시 있어야한다.

HTTP 패킷을 전송해볼 것이다.

HTTP는 TCP 위에서 동작하는 것이다.
이 때 좋은 툴이 있다. NetCat이라는 프로그램이다.
이 프로그램은 TCP 통신을 하는 프로그램이다.

* NetCat
 - telnet과 유사한 프로그램
 - TCP 통신을 할 수 있는 프로그램

1. 리눅스용
 - nmap 패키지에 포함
 - ncat
 - 서버로 실행 가능
 - 클라이언트로 실행 가능

2. 윈도우즈용
 - netcat
 - nc.exe
- 내용은 리눅스용과 같다.

NetCat을 설치할 것이다.
리눅스에서 ncat은 nmap 패키지에 포함되어있으므로 nmap을 설치해준다.




(nmap 설치)



ncat의 옵션을 확인해본다.




(ncat 옵션)



ncat으로 10000번 포트를 listen 상태로 열어둔다.




(10000번 포트 개방)



호스트에서 접속을 해볼 것이다.
윈도우에서는 nc.exe로 실행한다. 뒤에 IP주소와 포트번호를 적어주면 연결이된다.



(연결된 모습)



(리눅스 모습)


텍스트를 주고받을 수 있는 모습을 볼 수 있다.

netcat으로 http 통신을 확인해볼 것이다.
* 네이버에 페이지 요청을 하는 request패킷을 전송해볼것이다!

netcat을 이용해서 아래의 패킷을 보낼것이다. \r\n   캐리지리턴이 꼭 들어가야한다.
한줄 띤것까지 복사해서 보내본다.
-----------------------
GET / HTTP/1.1
Host: www.naver.com

-----------------------



(naver.com 연결)




(http 응답)



http의 웹 코드를 받은 것을 확인할 수 있다.

이제부터 실습을 naver.com에 직접하기는 조금 그러니
http 웹 서버를 리눅스에서 설치해서 그 페이지를 대상으로 패킷을 주고받아 볼 것이다.

리눅스에서 httpd를 설치한다.



(httpd 설치된 모습)



설치된 httpd에서 기본 설정된 페이지는 /var/www/html  에 들어있다.
여기에 기본 페이지 index.html을 만들어줄것이다.



(기본페이지 경로)




(간단한 페이지 작성)



페이지까지 작성을 했으면
웹서버를 실행시켜준다.




(웹서버 실행)



이제 호스트에서 인터넷 브라우저로 접속해본다.




(실험 타겟 페이지)



페이지가 잘 나온 것을 확인할 수 있다.

ncat을 이용해서 아까와 똑같이 get요청을 하여
응답을 받아봤다. 



(응답 모습)





(와이어샤크 분석)



와이어 샤크로 본 모습도 추가했다. 위와같은 메세지를 주고받은 것을 확인 할 수 있다.


여기서 헤더에 구성을 살펴보면 헤더를 이용한 취약점을 발견할 수 있다.

* DDos
 - GET Flooding : 대량의 GET패킷을 보낸다. 서버의 부하를 높인다.
 - CC Attack
   ( CC : Cache Control )
 - GET Flooding은 CC Attack과 함께 같이 사용한다.
 헤더의 Cache-Control에 no cache 등으로 설정해서
 캐시를 쓰지 않겠다해서 서버에 부하를 더 높이기 위한 방법이다.
 

 - Slow attack
1) slowloris attack
 
 - 헤더의 끝을 포함하지 않은 상태로 요청
 - 서버에서는 헤더가 완전히 도착하지 않았다고
    간주하여 세션을 계속 열어둔 상태로 둔다.

2) slow read attack
 -> body가 있어야하기 때문에 GET으로는 못한다.
 - 메세지 Body를 이용한다.

slowloris 공격과 slow read 공격을 직접 해보겠다.

1) slowloris 공격
이 공격은 마지막 캐리지 리턴을 빼서 보내는 것이다. 그렇게 되면
서버는 아직 패킷이 다 오지 않은줄 알고 다음 패킷을 계속 기다린다.
원래 웹서버는 통신이 끝난후 바로 연결을 끊는다.(사용자가 많기 때문에)
하지만 이렇게 계속 열어두게 되면
이런 패킷들이 많다면? -> 서버는 다운될 수 밖에 없다.

파이썬으로 프로그램을 작성했다.



(slowloris 공격 코드)



코드를 보면 50초마다 fake 헤더를 보내주는데
이유는 웹서버가 기다리다가 끊으려고 할 때쯤
헤더인것처럼 하나 더 보내주면 서버는 ' 아! 아직 더 있었구나!' 하고 기다린다.
그러다 또 끊으려고 하다가 또! 아! 더있구나! 하고 이런식으로 계속 기다리게 하는것이다.

와이어샤크로 분석해보았다.




(디도스 공격 패킷)




(웹 서버 포트 창)



웹서버의 포트 상태를 확인하면 ESTABLISHED로 되어있다.
웹서버에서는 이 상태는 비정상적인 것이다. 왜냐하면 웹서버에서는 통신을 하고 바로 끊기 때문이다.
이런 상태로 계속, 여러개 수가 많아지면 웹서버는 부하가 엄청날 것이다.

2) slow read 공격
content-length 헤더를 엄청 크게 잡아준다.
그리고 body의 내용을 찔끔찔끔 보내주는 것이다.
그러면 웹서버의 입장에서는 계속 기다려줘야하는 상황이 발생한다.
이런 패킷들이 많다면
웹 서버는 다운되게 된다.
body를 포함해야하므로 post 메소드를 이용해 패킷을 전송한다.




(slow read 공격 코드)




(패킷 상태)





(공격받은 모습)



이 공격도 마찬가지로 established가 되어있음을 확인 할 수 있다.




* HTTP ( Hyper Text Transfer Protocol )
 - 웹(Web) 통신에서 사용되는 프로토콜

* HTTP 메세지 구조
(\ -> 역슬래쉬)

-기본
start line\r\n   (모든 메세지는 스타트라인 한줄을 가지고 있다.)
header-field\r\n (헤더필드는 여러개가 올 수 있다.)
header-field2\r\n
ex)
header-name: header-value\r\n
...
\r\n     (캐리지리턴이 나오면 헤더필더가 다 나왔다는 것이다.
message-body (있을 수도 있고 없을 수도 있다.)

1) HTTP request Message
 request line\r\n
 request-header\r\n
 ...
 \r\n
 message-body







(요청 request-line)



1.1) request-line  ( sp :스페이스(공백), 구분자 )
 
 method sp URI(URL) sp HTTP version\r\n
method 필드




(메소드)



(메소드)



URI Vs URL
- URI : Uniformed Resource Identifier (자원에 대한 식별자)
- URL : Uniformed Resource Location (자원에대한 위치)
         : 어떠한 경로에 있는지 정확하게 나와있다.

2) HTTP response Message
 status line\r\n
 response-header\r\n
 ...
 \r\n
 message-body

2.1) status-line ( sp :스페이스(공백), 구분자 )
 HTTP version (sp) status code (sp) reason phrase\r\n

- HTTP의 request-line과 status-line의 구조를 살펴보았다.




* FTP ( File Transfer Protocol )
 - vsftpd(vsftpd는 FTP서버 프로그램 중 하나이다.)
 - FTP command

* root 사용자 로그인 설정
 - 루트 사용자는 원격 로그인을 허용하지 않는 것이 좋다.
 - 일반 사용자로 사용하는것을 권장한다.

* FTP 사용자
1) 리눅스 사용자
 - 리눅스의 사용자와 FTP의 사용자는 동일하다.
 - FTP 서비스를 사용하려면 리눅스 시스템에 사용자 계정이 있어야한다.
 - 홈 디렉터리 : 사용자의 홈 디렉터리

2) 익명 사용자
 - anonymous
 - 패스워드 없이 FTP 서버에 접속이 가능하다.
 -   -A 옵션을 주고 접속한다. (커맨드창에서 접속)
 - 홈 디렉터리 : /var/ftp


* FTP가 데이터를 송/수신 하는 방법
1) Active Mode( 능동모드 )
 - port 21
  - 로그인 인증
  - FTP command전달
 - port 20 ( ftp-data port)
  - 파일 송/수신
  
 ---> PORT 192,168,3,149,246,88
 (해석) IP 192.168.3.149;  256*246 + 88 번 포트
 * 클라이언트는 PORT 명령어를 통하여 서버에게 데이터를 전달할 ip와 port번호를 전달
 * 윈도우에서는 능동모드만 가능하다.
 
 * RETR (이 파일을 전달해줘라!)
2) Passive Mode( 수동모드 )
 - port 21
  - 로그인 인증
  - FTP command 전달
 - port 1024번 이후 포트
  -> 데이터 전달
 ---> PASV
 - PASV 요청을 하면 서버에서 접속할 IP와 포트번호를 알려준다.

이 내용을 한번 직접 확인해보겠다.

먼저 vsftpd로 FTP서버를 실행해준다.




(서버 오픈)



오픈된 것으로 21번 포트가 열려있는 것을 확인 할 수 있다.

윈도우에서 직접 로그인을 해보겠다.
ftp (ftp서버 IP)
로 접속 할 수 있다.




(ftp 서버 접속)



이렇게 접속하면
리눅스 계정으로 접속 한 것이다.

익명 접속도 해보겠다.
익명 접속은 명령어 -A로 접속한다.



(익명 접속)



또, 인터넷브라우저로 접속 할 수 있다.




(브라우저 접속)



* 브라우저 접속은
익명 접속이다.

익명 접속은 /var/ftp/pub 폴더가 홈 디렉터리이다.



(홈 디렉터리 확인)



접속 하는 과정을
와이어샤크로 패킷을 캡쳐해 보았다.



(FTP 패킷)



FTP는 TCP 위에서 동작하므로
TCP의 3 hand shaking 과정을 그대로 가지고 있다.
(확인 가능하다.)

FTP접속할 때 -d 명령어로 디버깅하면서
어떤 명령어가 전달되는지 확인해보겠다.



(FTP 옵션)



(디버깅 접속)



접속 과정을 보니 USER 뒤에 한칸 띄우고 아이디를 입력해서 전송한다.
그리고 암호는 PASS 뒤에 한칸 띄우고 비밀번호를 입력해서 전송한다.

이 과정을 파이썬으로 만들어보겠다.
똑같은 과정으로 로그인 까지 해보는 프로그램을 만들것이다.




(로그인 코드)



(로그인 화면)



잘 접속된 것을 확인 할 수 있다.

이 과정을 진짜 FTP 클라이언트처럼 만들어보겠다.
입력을 받고 로그인 하는 것이다.



(FTP 클라이언트 코드)




(실행 화면)



실행 화면도 잘 이루어졌다.

이번엔 FTP에서 파일을 전송하는 과정을 살펴볼 것이다.

샘플로 아래의 파일을 전송해보겠다.




(sample)



(put 명령어)



파일 전송은
put 명령어를 통해서 이루어진다.

전송 후 서버에서 확인해보겠다.



(확인)



확인해보니
sample파일이 올라가 있는것이 보인다.

이번엔 서버에 있는 파일을 다운로드 받으면서
포트 개방상태를 확인해 보겠다.



(파일 다운로드)



다운로드는 get 명령어를 이용한다.
여기서 실제로 전달되는 명령어인
PORT 192,168,3,149,246,88 을 잘 봐야한다.
아이피 주소 192.168.3.149이고 뒤에 256*246 + 88 번의 포트번호로 전송하라는 명령이다.



(서버의 20번 포트가 열렸다.)



(포트번호 확인)



포트 번호도 계산한 것과 같이 63064번의 포트로 전달되었다.

이것은 능동모드로 20번 포트를 통해 데이터가 전달되는 것을 확인할 수 있다.

이번엔 수동모드를 프로그램으로 만들어서 확인해보겠다.
윈도우에서는 능동모드만 지원하기 때문이다.

수동모드를 확인하기 위해서는
데이터를 받을 프로그램을 따로 작성해야한다.

먼저, 수동모드를 만들어보기전에
능동모드를 구현하고 수동모드로 만들어보겠다.



(데이터 받는 코드)




(실행화면)



(포트 상태)



포트로는 9999를 선택해서 열어주었다. 이쪽으로 데이터가 들어올 것이다.
능동모드에서는 사용할 포트번호를 정해서 보내기 때문에
미리 열어둔 것이다.



(능동모드 코드)





(실행화면)



실행하면
데이터 받는 코드의 실행 화면에서 데이터가 출력되는 것을 확인 할 수 있다.

이번에는 수동모드를 만들어보겠다.

수동모드는 간단하게 PASV 명령만 보내면 알아서 사용할 포트번호를 정해서 보내준다.



(수동 모드)



그렇기 때문에
데이터를 받을 프로그램에 포트번호를 미리 적을 수 없다.
전송하고 부여받은 포트번호를 확인해서
입력해준다.



(포트번호 입력)




(결과 화면)




결과화면은
수동모드에서도 똑같이 데이터를 받을 수 있었다.





* TCP SYN Flooding 공격
 - 고전적인 DDOS, DOS 공격 기법
 - 아주 잘 알려진 공격기법이다.
 - 대량의 TCP SYN packet을 이용해서 타겟 서버의 서비스를 더이상 사용할 수 없도록
    만드는 공격 기법이다.

TCP SYN Flooding 공격툴 작성

1) TCP SYN Packet을 작성
 - SYN,ACK 패킷을 수신한 이후에 ACK를 보내지 않고,
    서버와 연결을 맺지 않는게 핵심이다.
2) 반복해서 서버에 요청
3) IP Spoofing까지 해주어야한다.

먼저 우리가 만든 ftp 서버를 열어준다.
우리가 이 서버로 공격을 할 것이다.

명령어 service vsftpd start

그 후 netstat -ant
21번 포트가 열려있는 것을 확인 할 수 있다.



(서버 오픈)



SYN 패킷 전송하는 프로그램은
우리가 전에 TCP Half Scan에서 만들었던 것을 이용할 것이다.

아래 코드는
조금 수정한 코드다.
목적지 포트번호를 21번으로 맞춘다. 



(코드)



이렇게 만든후 패킷을 보내보았다.
와이어샤크에서 패킷을 확인해보았다.



(패킷 캡쳐)





(SYN_RECV)



서버 입장에서
SYN_RECV 상태로 바뀌었다. 패킷이 접수되고 Established로 넘어가지 않은 것은
내가 ACK 응답을 안보냈기 때문에
이 상태가 유지되는 것이다.
이 상태를 더 만들어주기위해
다른 패킷들을 보내는 것이다.

패킷을 반복적으로 보내주었다.
와이어샤크로 그 상황을 캡쳐했다.



(캡쳐 상황)




(결과 화면)



-> 이러한 여러 상태들이 만들어지지 않았다.
??
이유는 IP 하나에 하나씩 연결된다.
그렇기 때문에
IP 스푸핑을 해주어서 여러 IP주소로 보내줄 것이다.

IP를 랜덤으로 보내주기 위해서
random모듈을 이용할 것이다.

random.randrange를 이용해서
랜덤수를 이용할 것이다.



(random.range() 테스트)



랜덤모듈을 이용해서
난수를 뽑는 모습이다.



(IP스푸핑 코드)



IP스푸핑을 위해 a,b,c,d 에 랜덤수를 생성해서
출발지 IP주소에 넣어주었다.
그리고 체크섬을 다시 계산해야해서
반복문 안에 빼서 넣어주었다.

실행한 결과
서버의 모습이다.



(피해모습)




(피해모습)



피해모습을 보면 수많은 SYN_RECV 상태로 여러 수많이 남아있는 모습이다.

Dos 로는 여기까지지만
DDos를 이용하면 서버를 다운시킬 수 있다.
:)





오늘은 DNS Spoofing 프로그램을 이어서 완성해보겠다.

어제까지 DNS 패킷까지 필터링 하는 것까지 했다.

이제 DNS 응답 패킷을 만들어서 보내주면 된다.
가짜 IP주소로 192.168.3.151로 보내줄 것이다.
여기에 가짜 사이트를 만들어두었다.



(가짜 사이트)



이 사이트로 유도할 것이다.

어제까지 만들었던 것에서 DNS 데이터의 모양을 확인해보겠다.




(이전까지 만들었던 코드)




(DNS 패킷 전송)




(데이터 출력 화면)



여기서 우리는 출발지 주소와 목적지 주소를 교환해서 입력해줄 것이다.

DNS 응답 내용을 채워서 보낼 것이다.




(패킷 채우기)




(패킷 채우기)



(결과 확인)




(결과 확인)



결과를 보니 잘 들어가는 것을 확인 할 수 있다.
뒤에 0들이 있는 부분에 answer 필드를 채워서 보낼 것이다.




(answer 필드)




(결과화면)




결과화면을 보니 Answer필드도 채워졌다.
이제 이대로 전송하면된다.

전송 결과
피해자가
naver.com를 입력하니 가짜 사이트로 접속되는 것을 확인 할 수 있었다.









오늘은 스캔 공격을 할 것이다.
스캔 자체도 공격이므로
실제 사용시 처벌받는다. (그러므로 가상환경에서 혹은 자기 공유기 안에서만 하도록한다.!)
스캔은
보통 공격 전에 공격대상의 시스템을 확인 할 때 사용된다.

어느 포트가 열려있고, OS는 뭐를 쓰고있고 방화벽은 어떻게 있고 등등
스캔을 통해서 사전 정보를 입수한다.

스캔 공격을 하기 전에
피해자의 호스트에서 열수 있는 포트는 열기 위하여 아래와같이
서비스를 실행해준다.



(포트 개방)



그 후 공격자 호스트에서
nmap을 이용하여 스캔해준다.



(스캔)



스캔 결과를 보면 열려있는 포트 번호가 주룩 나와있다.

어떤 식으로 스캔을 하는 걸까?
피해자의 호스트에서 와이어샤크로 패킷을 분석했다.



(패킷 분석)



패킷을 보면 SYN 패킷과 RST 패킷이 잔뜩 보인다.

nmap은 기본적으로 다른 설정을 안해주면 TCP Half Scan을 한다.
스텔스 스캔이라고도 하는데
SYN 패킷을 걸고 응답이 ACK로 오면 RST로 끊어주고
응답이 RST로 오면 닫혀있다는 것을 아는 것이다.



(패킷 분석)



패킷을 보면 SYN 패켓에 대해 ACK 패킷이 오니까 바로 RST 패킷을 보내 끊어주었다.

이번엔 TCP Full Scan을 해보겠다.



(TCP Full Scan)




(패킷 화면)



패킷을 보면
연결을 다 해주는 것을 확인 할 수 있다.
이 때문에 흔적이 남는 단점이 있다.
원리는 Half Scan과 같다. 다만 RST를 보내지 않고 연결을 해준다는 것이 다르다.

이번엔 Fin 패킷을 보내는 Fin Scan을 해보겠다.
명령어는 -sF 이다.



(FIn Scan)




(패킷 화면)



패킷을 보면 FIN 패킷이 날라오는 것을 확인 할 수 있다.

FIN 패킷은 열려있으면 아무 응답이 없고, 닫혀있으면 RST가 오는 원리를 이용한다.

같은 원리인 크리스마스 Scan을 해보겠다.
명령어 -sX



(X-mas Scan)




(패킷 화면)



패킷을 보면 모든 Flag가 설정되있는 것을 볼 수 있다.

그 다음으로는 Null Scan이 있다.
Null 스캔도 Fin, X-mas Scan과 원리가 같다.
명령어는 -sN이다.



(NULL Scan)




(패킷 화면)



패킷을 보면 아무 Flag도 설정되있지 않아
<None>으로 표시되는 것을 확인 할 수 있다.

또 명령어 -O를 입력해주면
해당 시스템의 운영체제 정보를 확인 할 수 있다.



(-O 명령어)



조금 더 상세하게 운영체제 정보까지 파악 할 수 있다.

오늘은 공격전 상대의 정보를 파악하는데 필요한 스캔 공격을 알아보았다.



+ Recent posts