Web Fuzzer 팀은 이번주차에 취약점 분석을 위한 퍼징 및 Microsoft 문서를 학습하였다.
- 취약점 분석을 위한 퍼징 : 3. Network Protocol Fuzzing
- Automated Penetration Testing with White-Box Fuzzing : Fuzzing Process ~ Product-Testability Design for Fuzzing
<취약점 분석을 위한 퍼징 : 3. Network Protocol Fuzzing>
[요약]
1. Network Protocol Fuzzing?
• 서버의 데몬을 대상으로 하여 조작된 패킷을 전송하는 것
• 서버의 데몬 : 소켓을 통하여 클라이언트와 통신하는 어플리케이션
• Client에서 Server로 보낸 메시지: 데몬 - 받아서 파싱 후 연산처리
• 필요에 따라 다시 Client에게 메시지를 보냄
☞ 사용자의 입력이라는 과정을 거치므로 취약점 발생 가능.
네트워크 프로토콜 퍼저는 클라이언트의 입장에서 메시지를 조작하여 소켓을 통해 서버로 전송함.
2. 네이트온 프로토콜
(1) Update Server : 메신저의 버전 확인과 업데이트를 처
• 네이트온 메신저가 실행될 때 처음 접속되는 서버
(2) Dispatch Server : 사용자들을 분산시키는 역할
• 네이트온의 서버에 과부하가 걸리는 것을 방지
(3) Notification Server : 인증 처리, 쪽지 전송
• 사용자 인증, 그룹/친구 리스트 요청, 접속중인 친구 알림, 연결상태 확인
• 인증을 위해 주고받는 메시지는 TCP 소켓으로 통신이 이루어진다.
(4) Session Server : 사용자와 사용자 사이에 세션을 연결해주는 역할
• 대화, 파일 전송
• SS에 접속하려면 NS에서 RESS 메시지를 전송해야 한다.
2-3. Notification Server
1) 인증
• ssh 티켓을 받는 받는 법
• Ex) https://nsl.nate.com/client/login.do?id=[id]&pwd=[passwd]로 접속하면 응답메시지로 받을 수 있다.
• 인증에 필요한 메세지들
• 인증이 완료 시
• 서버는 클라이언트에게 10초 주기로 PING 메시지를 보낸다.
• 서버가 PING 메시지를 8번 보내는 동안 클라이언트에서 응답이 없으면, 서버가 강제로 소켓을 닫아서 연결이 끊어지게 되어 있다.
2) 쪽지 전송
• 쪽지를 전송하기 위해서는 CMSG 메시지 NS 소켓으로 보낸다.
• 쪽지의 전송이 성공 시 응답 메시지를 받을 수 있다.
2-4. Session Server 인증
•SS에 접속하려면 NS에서 RESS 메시지를 전송해야 한다.
•RESS 메시지를 NS로 보내면 서버로부터 RESS 메시지를 응답받는다.
3. 퍼징 방법
• 메시지 조작 = 패킷 조작
(1) 애플리케이션 계층(TCP, UDP 윗단)의 프로토콜을 퍼징
• 메시지의 순서를 무작위로 섞기
• null 문자를 삽입
• % 인코딩 이용
☞ 대부분의 서버 데몬들은 어플리케이션 층에서 동작하므로 이러한 방법들만으로도 퍼징의 효과를 볼 수 있다.
(2) TCP, UDP 소켓을 이용하여 퍼징
• 퍼징의 대상으로 삼을 서버의 프로토콜에 대한 이해 정도가 가장 중요
예) 특정 메시지만을 파싱하여 연산 처리하는 경우, 해당 메시지가 없으면 데몬이 패킷을 무시할 수 있음.
(3) 로우 소켓을 이용하여 TCP, UDP 헤더를 직접 조작하여 퍼징
• 네트워크 장치를 직접 다루기 때문에 OS의 권한 문제도 해결해야 하지만,
어플리케이션 계층의 프로토콜이 아닌 패킷 그 자체를 직접 퍼징하기 때문에 더 좋은 결과를 낼 수 있다.
• 프로토콜 퍼징이라기 보다는 네트워크 자체에 대한 퍼징으로 간주해야 한다.
(4) IP 계층까지 조작하여 퍼징
4. fuzzNateon.py
• 네이트온 프로토콜을 바탕으로 whitespace나 “\r\n” 등을 기준으로 메시지 내용을 쪼개어서 각 데이터에 에러가 발생할만한 쓰레기 데이터를 삽입하는 방법을 이용하는 예
• 통신에 이용되는 모든 메시지에 대해서 fuzzMsg() 메소드를 적용할 수 있다.
• Fuzzer를 돌리면서 서버로부터 에러코드가 반환되거나 소켓에러가 발생하면 퍼징이 성공하였다고 판단함.
• 그러나 그것이 바로 취약점이라고 단정할 수는 없다.
• 메시지가 부정확하다 고 서버가 판단하면 자동으로 소켓을 닫아버리기 때문에 그런 경우에도 소켓에러가 발생한다.
[추가 자료 서칭]
1. 데몬(daemon) 이란?
네트워크 프로토콜 퍼징은 서버의 데몬을 대상으로 하여 조작된 패킷을 전송하는 것을 말한다.
• 리눅스 시스템이 처음 가동될 때 실행되는 백그라운드 프로세스의 일종.
• 사용자의 요청을 기다리고 있다가 요청이 발생하면 이에 적절히 대응하는 리스너 역할
• 사용자에게 무언가를 전달받지 않고 스스로 동작하는 프로세스
• MS 윈도우의 서비스(service)와 유사, 실제로 ‘서비스’ 라고 부르기도 함.
• 이름의 유래: 열역학에 영향을 끼치며 일을 하는 도깨비처럼 보이지 않는 곳에서 작업을 하는 백그라운드 프로세스를 귀엽게 표현
• 서버데몬 유형: 웹서버데몬(httpd), DB서버데몬(mysqld)
• ex. service httpd start/stop/restart로 데몬 실행 및 종료
• e.g) 사용자가 ssh접속(로그인)을 위해 주소입력 (https://~~~)
→ Cmd가 사용자가 입력한 ssh명령을 해석이 실행하고, 해당 주소로 ssh접속 시도
→ 서버에서 실행중인 ssh데몬과 세션을 맺은 다음 그 ssh 데몬이 사용자에게 보여주기를 원하는 내용을 전달받아 화면에 출력한다.
2. 소켓이란?
서버의 데몬은 소켓을 통하여 클라이언트와 통신하는 어플리케이션이다.
• TCP/IP로 통신을 행하는 컴퓨터가 가지는 네트워크 내에서의 주소에 해당하는 IP어드레스와 IP어드레스의 서브(보조)어드레스인 포트 번호를 조합한 네트워크 어드레스이다.
• 네트워크상에서 서버와 클라이언트 두 개의 프로그램이 특정 포트를 통해 양방향 통신이 가능하도록 만들어주는 소프트웨어 장치라 말할 수 있다.
• 소켓을 정의하는 것: IP 주소, 포트 넘버, 프로토콜 (하지만 이것이 유일하게 소켓을 식별하지는 않는다.)
• 소켓 식별은 소켓의 id 값으로 한다.
• 같은 IP 주소, 포트 넘버, 프로토콜을 가지는 소켓이 수십 혹은 수만 개의 소켓을 가질 수 있다.
• ex. 게임 서버 동시 접속자 수 수십수백만.
3. 포멧 스트링 공격(Format String Attack)
: 포맷 스트링의 취약점을 활용한 공격
• 포멧 스트링 : 사용자로부터 입력값을 받아들이거나 결과를 출력하기 위해 사용하는 형식(ex. %d, %f, %c 등)
• %n(형식 지시자) : 출력될 문자들의 개수를 셀 수 있는 기능
• %n 지시자 전에 지정된 출력되어야할 모든 공간의 개수를 해당 변수에 저장하여 메모리나 값을 조작
즉, 출력하려는 문자열 내 %d와 같은 지시자가 들어있게 되면 형식 지시자 개수만큼 인자들이 스택으로부터 추출
→ 사용자의 입력에 따라 지시자의 수가 달라지기 때문에 악의적인 공격자에 의해 스택의 내용 확인 가능
• \r\n 의 의미
• \r(Escape Character, 탈출 문자) à 커서를 그 줄의 맨 앞으로 이동
• \n(Line Feed) à 다음 줄로 넘어가기 위한 개행 문자
→ 2번 보내면 헤더라인이 끝났다는 의미
→ 1번 보내면 보낼 것이 남아있다는 의미
4. 힙을 사용한 메모리 손상
힙(heap)이란?
• 사용자가 직접 관리할 수 있는 영역
• 사용자에 의해 메모리 공간이 동적으로 할당되고 해제됨
• 메모리의 낮은 주소에서 높은 주소 방향으로 할당
• malloc() 또는 new 연산자를 통해 할당하고 free() 또는 delete 연산자를 통해 해제가 가능
• 장점
• 프로그램에 필요한 개체의 개수나 크기를 미리 알 수 없는 경우에 사용
• 개체가 너무 커서 스택 할당자에 맞지 않는 경우 사용
• 단점
• 할당/해제 작업으로 인한 속도 저하
• 응용 프로그램에서 힙 블록을 적절하지 않게 사용할 경우 힙이 손상(이중 해제, 해제 후 블록 사용, 블록 경계 덮어쓰기 등)
<Automated Penetration Testing with White-Box Fuzzing : Fuzzing Process ~ Product-Testability Design for Fuzzing>
[추가 자료서칭]
1. MTBF이란?
• 평균 장애 간격 Mean Time Between Failure
• 운영 시간 수 / 실패 수
• 예를 들어 어떠한 프로그램이 1년에 1,000시간 운영, 그 한 해 동안 8번 broke, MTBF는 125시간
2. ISA Server 2006 case study
Microsoft ISA (Internet Security and Acceleration) Server 2006을 개발하는 동안 퍼징에 대한 사례 연구 제공
☞ Black box일 때 30%의 결함 발견, 나머지는 white box fuzzing으로 결함이 발견되었다.
[출처]
부경대학교 CERT-IS - 취약점 분석을 위한 퍼징
hisjournal.net/doc/[KUCIS_Project]_Fuzzing_for_Finding_Vulnerabilities_by_CERT-IS.pdf
github.com/Funniest/Easy_fuzzer
Microsoft Document - Automated Penetration Testing with White-Box Fuzzing
'4-9. 2020-2 심화 스터디 > 웹 퍼저' 카테고리의 다른 글
[2020.11.28] 세미나 준비 (0) | 2020.11.28 |
---|---|
[2020.11.21] Fuzzer review (open source) (0) | 2020.11.21 |
[2020.11.14] pydbg를 이용한 퍼저 구현 (0) | 2020.11.14 |
[2020.11.07] File Format Fuzzing & Memory Fuzzing (0) | 2020.11.07 |
[2020.09.19] Web Fuzzing (0) | 2020.09.19 |