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에서 정책이 업로딩 되는 것을 확인할 수 있었다.
일단, 안랩 방화벽에서 로그 상세보기로 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() 함수를 이용해 부모 프로세스의 소켓 객체 종료
참조
오동진, 박재유. (2020). 모의 침투 입문자를 위한 파이썬 3 활용 (pp. 75-77). n.p.: 에이콘