본문 바로가기

Programming/Python

Raw 소켓 스니핑

Raw 소켓 스니핑


이번에는 Raw 소켓 스니핑에 대해서 알아보도록 하겠습니다.


먼저 Raw 소켓은 프로토콜을 설계하여 구현하거나 패킷을 조작할 때 사용하는 소켓입니다.

커널 수준에서 다루는 헤더 등을 조작할 수 있죠. 따라서 일반 유저 권한 사용자가 사용할 때는 커널에서 알아서 프로토콜 헤더를 붙여 전송하지만 루트 권한 사용자는 직접 프로토콜 헤더의 전부 또는 일부를 만들거나 사용할 수 있습니다.



먼저 struct에 대해서 알아보죠.

struct는 python과 C 자료간의 변환을 하도록 해줍니다.







위 표는 Raw Socket Sniffing 포멧 스트링과 제어문자 입니다. 이러한 것들이 어떻게 사용되는지 알아보죠.






pack은 해당 하는 값을 \x00 꼴로 만들어주고 unpack은 \x01의 값을 '1' 형태로 만들어 줍니다.





이제 본격적으로 Raw Socket을 이용해 Packet Sniffer를 만들어 보도록 하죠.





위 소스코드를 인터프리터로 한 줄씩 실행시켜보면서 설명을 하도록 하겠습니다.





2~3 : socket, struct, binascii 모듈을 import 합니다.


5 : PF_SOCKET은 Low Level socket을 사용하기 위한 것이고, SOCK_RAW는 Raw 소켓을 사용하기 위한 것입니다.

htonns(0x800)은 ethertype이라고 하는데, IPv4의 ethertype을 말합니다.


6 : 값을 받아오는 역할을 합니다. 이때, 웹 페이지에 접속합니다.


7 : 받아온 값을 출력합니다.


8 : 받아온 값들이 출력됩니다.


10 : 반다온 값을 [0][0:14]까지 출력합니다.


11 : 네트워크이므로 !를 사용했고, 6바이트, 6바이트, 2바이트로 끊어서 나타냅니다.


13 : 0:14까지 받아온 값을 6바이트, 6바이트, 2바이트로 끊어서 출력합니다. 첫 번째 6바이트는 목적지 맥 주소이며, 두 번째 6바이트는 출발지 맥 주소입니다. 마지막으로 세 번째 2바이트는 ethertype을 말합니다.


15~20 : binascii.hexlify()는 해당하는 값을 '\x'를 제거하여 표시해줍니다.


22 : IP Header 값을 가져옵니다. [0][14:34]까지의 값입니다.


23 : 마찬가지로 12바이트, 4바이트, 4바이트로 나타냅니다.


27 ~ 30: inet_ntoa()는 IPv4 주소 형식의 문자열로 나타내어 줍니다.


32 : tcp Header 값을 가져옵니다. [0][34:54]까지의 값입니다.


35 : short형, short형, 16바이트로 나타냅니다.


37 : 첫 번째는 목적지 포트, 두 번째는 출발지 포트를 나타냅니다.




'Programming > Python' 카테고리의 다른 글

Immunity DBG 기초  (0) 2016.03.14
Exploit 기초  (0) 2016.03.14
웹 페이지 만들기  (0) 2016.03.14
소켓 서버 프레임워크  (0) 2016.03.14
서버 프로그램  (0) 2016.03.14