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

* 취약점 스캐너
 - 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를 입력하니 가짜 사이트로 접속되는 것을 확인 할 수 있었다.









(1)에서
ARP Spoofing까지 프로그램을 마무리했다.

그리고 포워딩 기능을 추가하기로 했는데
포워딩을 그냥 윈도우의 라우팅 서비스를 이용할 것이다.

이제 받아온 패킷에서
DNS 패킷을 구별하고
www.naver.com 특정 도메인 네임에 맞는 패킷들을
필터링 할 수 있어야
그 패킷에 대한 응답을 먼저 할 수 있다.
그리고 그래야 DNS Spoofing을 할 수 있다.

먼저 DNS 패킷을 구별해보자.

DNS는 53번 포트를 사용하므로 udp 헤더의 도착지 포트번호를 확인하면 된다.




(DNS 포트 53번 확인)




(DNS 패킷 생성)





(DNS 패킷이 수집된 모습)



DNS 내용이 수집된 화면이다.
맨 앞 두바이트가 Trx ID이고 (DNS Spoofing때 필요한 항목이므로 뽑아낼 수 있어야한다.)
그 다음 2바이트 0x0100 Flag가 보인다.
그 다음 2바이트 Question, Answer, Authority, addional 이 보인다.
그리고 3으로 시작하는 DNS 주소가 보인다.
DNS 패킷이 맞는걸 확인 할 수 있다.

이제 여기서 DNS Question의 주소부분만 떼올 수 있어야한다.
unpack을 사용해서 질문 필드만 떼어내 보았다.




(쿼리 내용 추출)





(내용 화면)



처음에는 출발 포트번호 53번도 적용시켜서 응답까지 봤는데
잠깐 우리가 패킷을 분석하면서 확인해야하므로
목적지 포트 53번만 검사하도록 잠깐 수정했다.
(또, 내 호스트에서 나가는 패킷으로 검사할 것이므로 내 패킷이 보이도록 수정했다.)




(확인을 위한 수정)





(www.naver.com 검색)





(결과화면)



naver 를 검색한 DNS 패킷 내용만 잘 출력되는 것을 볼 수 있다.

여기서 DNS Spoofing에 필요한 정보
1. Src Port Number
2. Transaction ID
3. DNS 물어보는 내용

위 내용을 확인해보도록 하겠다.




(확인 코드)




(결과)



이제 여기서 주소 도메인 네임만 정확히 뽑아내야한다.

그러기 위해 바이트형식으로 되있으니 decode()를 해주었다.



(decode() 코드 추가)





(결과 화면)



www.naver.com이 잘 보인다.
이제 이 것을 문자열로 뽑아내는게 일이다.



(도메인 부분만 뽑아내는 코드)



(결과 화면)



도메인 네임만 잘 보이게 되었다.

이제 다시 src_ip != 100 으로 수정하여 나의 IP를 제외한 다른 패킷들을 볼 것이다.
조건을 수정해주고

ARP Spoofing을 해준다음
아래의 코드를 실행시켰다.
그리고 피해자는 www.naver.com에 접속하였다.





(완성한 코드)





(입력한 naver.com가 보인다.)



피해자가 보낸 패킷의 내용을 덤프 받을 수 있고
확인 할 수 있었다.

여기 까지 했으니 (3)에서는
이 패킷을 받아서 naver.com을 물어보는 패킷에 대해
응답패킷을 만들어서 피해자에게 보낼 것이다.

그렇게 되면 DNS Spoofing 공격에 성공하게 되는데
그 결과를 확인해 볼것이다.




DNS의 동작 까지 확인해보았고
오늘은
DNS 동작을 이루는 패킷이 어떻게 이루어져 있는지 분석해보겠다.

호스트의 DNS IP주소를 확인해보겠다.




(DNS 서버 주소)



164.124.101.2 로 되어있다. 아래 IP주소도 맞다.
DNS 캐시 서버이다.

이제 패킷을 덤프해서 확인해보겠다.
와이어샤크 실행
간단하게 캡쳐 필터링 룰을 설정하였다.




(캡쳐 필터링 룰 설정)



멀티캐스트를 제거하였다.
멀티캐스트와 브로드캐스트를 제거해야하는데 지금보니
위에 오타가 있었다. :)

간단한 룰을 설정해주고 naver.com에 접속하였다.
(도메인 네임을 가지고)




(naver.com 입력)



그리고 디스플레이 필터 룰을 dns 로 설정하여
dns 패킷만 확인하였다.
아래 화면에
같은 Trx Id 를 가진 패킷들을 빨간색 표시해두었다.




(DNS 패킷)



디스플레이 필터링 룰을 dns.id == 0x0e68 로 설정하여
해당 아이디의 패킷만 필터링 하였다. (보기 좋게)



(필터링 룰 적용)



이제 query (Qeustion) 패킷부터 살펴보겠다.




(Trx ID)



DNS query 패킷의 첫번째 요소는
Transaction ID 이다.
UDP 통신이기 때문에 패킷을 구별할 수 없다. 그렇기 때문에 이 ID가 존재하고
이 ID로 해당 질문에 대한 답변을 구분 한다.




(Flag)



두번 째는 Flag이다.
질문, 응답 등의 패킷 타입을 결정한다.




(Question)



Question 필드에는 물어보는 도메인 네임의 수이다.
보통 한개가 생기면 바로 물어보기 때문에
한개 이상의 패킷을 보기는 힘들다.




(나머지 필드)



나머지로 Answer , Authority, Addional 이 있다.
Answer는 질문에 대한 답이고
Authority는 그 답에대한 근거(?) 출처(?) 정도이다.
Additional은 추가적인 내용이 붙는다.

정리하자면
DNS Header
 1. transaction id (2바이트)
 2. Flag (2바이트)
 3. qeustion(2바이트)
  - 질의 갯수
 4. answer(2바이트)
 5. authority(2바이트)
 6. additional(2바이트)

이렇게 구성되어있다.
도메인 네임의 전송을 살펴보겠다.



(www.naver.com 이 담겨져 있는 모습)



살펴보면
먼저 문자의 수가 나온다. 03, 그 뒤로 www (77 77 77) 이 나온다.
그리고 다시 문자의 수 05, 그리고 naver 5글자가 나오고
마지막으로 03 , com 3글자가 나온다.




(응답 패킷)



응답 패킷을 보면
DNS 헤더의 똑같은 양식에
응답부분이 채워져서 전송되었음을 확인 할 수 있다.

그러면 위에서 작성했던 도메인 네임을 여러번 쓸까?

그렇지 않다.
패킷을 잘 보면 c0 이 보이는데
c0은 포인터라는 뜻이다.
c0 뒤에 2b는 43이라는 숫자로 DNS 헤더의 43번째에 있는 주소를 나타내는 뜻이다.



(포인터 표시)



지금까지 DNS 패킷을 분석해보았다.

이제 DNS 패킷을 조작하여 할 수 있는 공격기법을 살펴보겠다.

* DNS Spoofing
- DNS를 속이는 공격 기법
 - trx id와 포트번호를 맞춰야한다.
 - Birthday Attack(추측성 공격, trx id를 추측하는 공격기법)
 - 그래서 보통 ARP Spoofing과 함께 공격을한다. (클라이언트가 대상일때)
 - 스푸핑 환경을 만든 후에 공격을 한다.
 - 공격자와 피해자가 같은 환경에 있어야한다.


DNS Spoofing을 해볼 것이다.

우리가 작성해야할 프로그램
1. ARP spoofing (pcap library를 이용)
 1) arp cache poisoning
 * ARP request 메세지를 작성하여 스푸핑
 * 브로드 캐스팅은 사용하지 않는다
 * 유니 캐스팅을 할 수 있도록 작성
target : 192.168.3.99
 - mac : 90-9f-33-ec-cc-37
attacker : 192.168.3.100
 - mac : 90-9F-33-EC-CB-0B
게이트웨이
 00-10-f3-4e-58-40

2. DNS spoofing (pcap library를 이용)
 
0) packet forwarding
  - 자기 패킷이 아니라면 원래 목적지로 포워딩
 1) DNS Query 패킷을 모니터링
 2) 타겟 도메인(www.daum.net) 모니터링
 3) 속이려고 하는 도메인에 대한 DNS 쿼리
     패킷이 검출되면 가짜 응답을 만들어서 전송해준다.
  - 출발지 포트번호와 TRX id 정보를 알아야 한다.

먼저 ARP Spoofing도구를 만들것이다.
(이건 우리가 전에 작성했던 코드로 바로 여기서 사용하겠다.)




(ARP Spoofing 코드)



이 프로그램으로 ARP 스푸핑이 된 결과를 확인 할 수 있었다.

두번째로
DNS Spoofing을 해주는 프로그램을 만들 것이다.
우리가 ARP 스푸핑을 해서 스니핑을 할 때 포워딩 기능이 없었다.
그래서 DNS Spoofing 코드에 포워딩 기능을 추가할 것이다.

먼저 포워딩 기능 부터 구현해보겠다.

arp_cache_table 변수는
subprocess를 이용해 arp table을 받아 가지고 있는 arp table이다.
IPv4 패킷만 걸러내보겠다.




(IPv4 필터링)




(결과 화면)



끝에 2048이 16진수로 0x800이다. IPv4만 걸러낼 수 있다.

여기서 IP 주소를 보고 구별 할 것이다.

나에게 오는 것이 아닌것 그리고 브로드캐스팅 되는 것 멀티캐스팅되는것을 제외하고는
포워딩을 해줘야할 필요가 있다.
그 패킷들만 필터링 해보겠다.



(포워딩할 패킷 필터링)



자 여기까지 포워딩이 되야할 필터링을 마쳤다.
이제 ARP 스푸핑과 지금까지 작성됬던 프로그램을 동작시켜서
포워딩 해야할 패킷들이 잘 필터링 되는지 확인해 보겠다.
두개 같이 동작 시킨후
피해자가 8.8.8.8 외부 IP로 핑 메세지를 보냈다.



(결과화면)




결과 화면을 보면
99(피해자)가 보낸 핑 메세지들이 필터링 되서 내 화면에 출력되고 잇는 것을 확인할 수 있다.

이제 여기서 포워딩을 추가해주고
DNS Spoofing 프로그램을 만들어 보겠다.


+ Recent posts