brunch

You can make anything
by writing

C.S.Lewis

by Younggi Seo Aug 19. 2021

소켓의 개념과 객체 생성 방법

Python Penetration Restart





어제 근무지에서 산업통상자원부(이하 '산업부')의 TMS(Threat Management Sensor) 시스템에서 배포하는 룰셋(IPS 정책)을 가져오지 못하는 통신 문제를 확인하기 위해 중간에 거치는 안랩 방화벽에 해당 트래픽의 상세로그를 봤다.


처음에 생각하기로는 산업부에서 통신세션이 이루어지지 않아 재차 RST(ReSeT) Flag 패킷을 보낸 것으로 확인했었는데, RST 패킷을 보낸 발지가 본래 도착지인 근무지 사이트의 IPS생각의 방향을 틀었다. 그래서 3-way-handshaking(3단계 연결)  되는 것은 도착(근무지 사이트) 소켓 접속을 위한 Lisetening 상태로 되어 있다고 하더라도, 접근제어(ACL) 의해서 결국 산업부에서 보내는 정책이 담긴 패킷이 도착하지 못하고 있다고 추측했다.


해결은 /etc/hosts 파일에 도메인명과 상관없이 우리가 수신하는 IP(관리자 포트와 binding)를 추가하니 아래와 같이 통신이 맺어진 것(established)을 확인한 뒤 곧이어 우리 측 IPS에서 정책이 업로딩 되는 것을 확인할 수 있었다.


ESTABLISHED(통신 맺음)을 실시간으로 확인함. 해당 IP는 실제 산업부 장비 IP는 아님. 이후에 산업부 TMS IP 와 커넥션됨.


일단, 안랩 방화벽에서 로그 상세보기로 RST가 찍힌 '연결 종료' 패킷은 출발지가 산업부 IP로 되어 있어서 혼동되었고, 반면에 시큐아이 방화벽을 거치는 다른 IPS로 정책을 보내는 경우 해당 방화벽에서 3 way-handshaking과 RST가 함께 찍혀있었는데, 오래된 시리즈(MF1)의 방화벽이라 정확한 패킷 전송 과정명을 보여준 거는 아니었다.


3-way-handshaking은 엄밀히 말하면 ACK 플래그를 담은 패킷을 출발지로부터 받아야만 TCP 3단계 연결이 이루지는 셰션 과정을 일컫기 때문이다. 아래는 파이썬으로 TCP 소켓 서버를 구현하는 순서이며, 본인의 랩탑에서 TCP 클라이언트(서버에 서비스를 요청하는 측) 접속이 이루어져 소켓 객체 내용을 연달아 확인한 화면이다.



1. socket() 함수를 이용해 소켓 객체 생성

2. IP 주소 설정

3. 포트 번호 설정

4. bind()  함수를 이용해 IP 주소와 포트 번호의 연동(Binding)

5. listen() 함수를 이용해 '3단계 연결 과정' 구현

6. accept() 함수를 이용해 3단계 연결 이후 과정 구현

7. 소켓 서버의 동작 과정 구현

8. close() 함수를 이용해 자식 프로세스의 소켓 객체 종료

9.close() 함수를 이용해 부모 프로세스의 소켓 객체 종료


필자의 노트북에서 TCP 접속을 하여 소켓 객체 내용( [1] 203 → [2] 205 )을 확인함. 백그라운드(&)로 소켓접속을 실행시켜서 확인함.





참조

오동진, 박재유. (2020). 모의 침투 입문자를 위한 파이썬 3 활용 (pp. 75-77). n.p.: 에이콘











매거진의 이전글 파이썬에서 socket 모듈의 확인 및 활용
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari