NMAP 문제 풀이
어제 Blue 문제 풀이를 마쳤는데, 이 문제를 풀기 전에 선행 학습으로 할 수 있는 nmap room도 있길래 한번 풀어보기로 했다.
https://tryhackme.com/r/room/furthernmap
Task1: Deploy


그림과 같이 여러 개의 웹사이트에 동시 접속할 때를 보자. 서버단에 있는 443 포트는 동일하지만, 클라이언트 PC의 임의 포트는 모두 다르다. 컴퓨터에서 사용 가능한 포트는 총 65535개이고, 상당수의 포트가 자주 사용되는 포트이다.
HTTP는 80번 포트, HTTPS는 443번 포트이며, Windows NETBIOS는 포트 139, SMB는 445포트이다. 그렇기 때문에 포트 스캐닝은 공격 대상 서버가 어떤 포트를 열어두고 서비스를 실행하는지 알아내는데 중요한 도구가 될 것이다.
이 포트 스캐닝을 위해 필요한 것이 바로 NMAP이라는 툴이다. 포트의 Response에 따라 이 포트가 열렸는지, 닫혔는지, 방화벽에 의해 필터링 되었는지 확인할 수 있다. 그리고 포트가 열려있으면 서비스를 확인할 수 있는 것이다. 포트스캐닝에서 제일 대표적으로 사용되는 둘이 nmap이 때문에 이번 학습 페이지에서도 nmap을 공부하게 된다.
- What networking constructs are used to direct traffic to the right application on a server?
-> 포트
- How many of these are available on any network-enabled computer?
- [Research] How many of these are considered "well-known"? (These are the "standard" numbers mentioned in the task)
Task3: NMAP SWITCHES
다른 펜테스팅 툴과 동일하게, NMAP도 터미널에서 동작한다. 윈도우, 리눅스에서 둘 다 사용 가능하다. 그리고 스위치는 동일해야 한다고 한다.
task 3는 nmap의 사용법을 상세하게 알려주고 있다. 내용에 따라서 차근차근 따라해보자.
- What is the first switch listed in the help menu for a 'Syn Scan' (more on this later!)?
Syn Scan을 위해 헬프 메뉴에 첫번째 스위치가 뭐냐고 물어보고 있다.. (그런데 여기서 '스위치'라는 단어가 왜 사용되는 지는 잘 모르겠다. 검색해봤는데 내가 알고 있는 2계층 스위치의 뜻이 아니고 명령어의 옵션, 플래그의 뜻으로도 쓰인다고 한다) 일단 syn scan을 할 때 명령어는 -sS이다. (Syn Scan의 앞 글자를 따 사용)
- Which switch would you use for a "UDP scan"?
UDP 스캔을 위해 사용해야 할 옵션은 무엇일까?
- If you wanted to detect which operating system the target is running on, which switch would you use?
어떤 operating system(운영체제)이 실행되고 있는지 알아내려면 어떤 명령어를 써야할까?
- Nmap provides a switch to detect the version of the services running on the target. What is this switch?
서비스의 버전을 알아낼 수 있는 명령어
그냥 -v가 아니고, -sV이다. (Service Version scan, 참고로 대소문자 구분해야 함)
- The default output provided by nmap often does not provide enough information for a pentester. How would you increase the verbosity?
verbosity: 자세하게, 상세하게

더 상세하게 확인하려면 -vv 옵션을 사용하면 된다.
- Verbosity level one is good, but verbosity level two is better! How would you set the verbosity level to two?
(Note: it's highly advisable to always use at least this option)
- We should always save the output of our scans -- this means that we only need to run the scan once (reducing network traffic and thus chance of detection), and gives us a reference to use when writing reports for clients.
What switch would you use to save the nmap results in three major formats?

output과 관련된 명령어는 다음과 같다. 잘 읽어보면 Output in the three major formats at once라는 설명이 적힌 명령어가 있다.
가볍게 실습을 진행해보았다.


세개의 포맷으로 저장되었다.
- What switch would you use to save the nmap results in a "normal" format?
normal 포맷의 결과를 저장하기 위해서는 어떤 명령어를 사용하는가.
-oN 옵션의 Normal은 일반 텍스트 파일로 저장되는 것을 의미하는 것 같다.
- A very useful output format: how would you save results in a "grepable" format?
grepable 포맷을 저장하기 위해서는 어떤 명령어를 쓰면 될까?
-> -oG, grepable 은 우리가 흔히 사용하는 grep을 의미 한다.
이런식으로 저장됨.
아직 -oG 옵션을 언제, 어떻게 사용하는지까지는 잘 모르겠다.
- Sometimes the results we're getting just aren't enough. If we don't care about how loud we are, we can enable "aggressive" mode. This is a shorthand switch that activates service detection, operating system detection, a traceroute and common script scanning.
How would you activate this setting?



- Nmap offers five levels of "timing" template. These are essentially used to increase the speed your scan runs at. Be careful though: higher speeds are noisier, and can incur errors!
How would you set the timing template to level 5?


-T 옵션, 0부터 5까지 설정 가능하고, 5가 가장 빠르다고 한다.
- We can also choose which port(s) to scan.
How would you tell nmap to only scan port 80?
특정 포트만 선택해서 스캐닝이 가능하다. 80번 포트만 스캐닝하는 방법은?
- How would you tell nmap to scan ports 1000-1500?

- A very useful option that should not be ignored:
How would you tell nmap to scan all ports?

help에서는 딱히 해답을 찾을 수 없었는데, 어쨌든 포트스캐닝을 할 때 특정 범위를 스캐닝 하려면 -p1-65535 이런식으로 하이픈을 사용하고, 모든 포트를 스캐닝하면 그냥 하이픈하나만 사용하면 어떨까하는 생각이 들어서 하이픈(-)만 넣어봤는데, 정답이었다.
- How would you activate a script from the nmap scripting library (lots more on this later!)?
- How would you activate all of the scripts in the "vuln" category?

--script=vuln
Task 4: Overview
포트 스캐닝을 할 때 가장 간단하고 자주쓰이는 스캔 타입 3가지가 있다.
- TCP Connect Scans (-sT)
- SYN "Half-open" Scans (-sS)
- UDP Scans (-sU)
그리고 상위 스캔 타입보다는 덜 쓰이지만, 앞으로 다룰 3가지 스캔 타입도 있다.
- TCP Null Scans (-sN)
- TCP FIN Scans (-sF)
- TCP Xmas Scans (-sX)
모두 패킷의 앞글자를 따 만든 용어들이다.
네트워크 스캐닝을 할 때 필요한 ICMP 스캐닝도 곧 알아볼 것이다.
Task 5: TCP Connect scans
TCP 연결 수립 과정에 대해 공부한다. 정보보안기사에서도 중요하게 다루는 TCP 3-way 핸드쉐이크에 대해 설명하고 있다. 해당 용어가 처음이라면 아래 과정을 먼저 공부하는 걸 권한다고 한다.
https://tryhackme.com/r/room/introtonetworking
Three way 핸드 쉐이크를 간단하게 정리해보면 다음과 같다.
클라이언트가 TCP SYN flag를 서버에게 보내면, 서버는 TCP response로 SYN+ACK flag를 보낸다. 그리고 클라이언트에서 ACK flag를 보내면 연결이 수립되는 것이다.


해당 부분이 TCP/IP 네트워킹의 기본적인 과정이라고 한다. 잘보면 192.168.1.142에서 먼저 첫번째 SYN 패킷을 보내고, 두번째 SYN,ACK, 그리고 세번째에 ACK을 보내 192.168.1.141과 연결을 수립하는 것을 알 수 있다.
이게 어떻게 NMAP과 연결되어 있냐면, NMAP이 각 특정한 TCP 포트와 연결하려고 하고, 서버로부터 response 값을 받을 때 이게 오픈되어 있는지 아닌지에 따라 서비스를 할지 말지 결정하는 역할을 한다.
그래서 포트가 닫혀있으면 RST + ACK을 받게 되고 열려 있으면 SYN + ACK 을 받는 것이다. NMAP은 이런 결과를 보고 포트가 열려있는지, 닫혀있는지를 저장하게 된다!
하지만 한 가지 예외가 있다. TCP SYN 요청을 보냈는데, 아무런 응답을 받지 않았다면 이 포트는 방화벽에 의해 필터링되고 있다고 간주한다.
RST TCP 패킷으로 응답하도록 설정하는 방법이 있는데, Linux는 IPtables에서 관리하면 된다.
-> iptables -I INPUT -p tcp --dport <port> -j REJECT --reject-with tcp-reset
이는 대상의 정확한 상태를 파악하는 것이 어렵게 만들 수도 있다.
Which RFC defines the appropriate behaviour for the TCP protocol?
If a port is closed, which flag should the server send back to indicate this?
만약 포트가 닫혀있다면 서버에서 어떤 플래그를 보내야할까?
-> RST
TASK 6: SYN SCANS
SYN 스캔은 Half-open 스캔이나 Stealth 스캔으로 불리기도 한다.
보통 TCP 스캔에서 SYN을 보내고, SYN ACK을 돌려 받았을 때, 클라이언트에서 RST 패킷을 보내는 경우가 있다.
이전 침임 탐지 시스템 우회에도 사용될 수 있다. 보통 스텔스 스캔이라고 많이 불린다. (TCP 스캔보다 빠름) 일반적으로 SYN 스캔을 작동시키려면 sudo 권한이 필요하다. nmap에서 sudo 권한으로 실행되면 SYN 스캔을 사용한다고 보면 되겠다.
SYN 스캔이 TCP 스캔과 동일한 점은 포트가 닫혔을 때 RST 응답을 받는다는 것. 하지만 다른점은 포트가 열려있을 때이다.
결론적으로 SYN 스캔은 sudo 권한으로 실행되면 Nmap에서 기본 스캐닝으로 사용된다는 것. 그게 아니라면 TCP 스캔으로 디폴트 값이 정해진다.
Can Nmap use a SYN scan without Sudo permissions (Y/N)?
Sudo 퍼미션 없이 SYN 스캔을 할 수 있는가? -> N
퍼미션이 없으면 디폴트는 TCP 스캔이다.
Task7: UDP Scans
UDP의 가장 두드러지는 특징은 비연결지향이라는 것. 3-WAY 핸드쉐이크 뭐 이런 연결 지향형인 TCP랑은 완전 정반대다. UDP는 그냥 신뢰성 없이 패킷을 보내기만 하면 되는 만사가 귀찮은 친구라고 보면 된다. 그래서 속도가 빠른 편.
-sU로 표현한다.
열려있는 포트로 보내면 응답이 없고(open|filtered), Response를 받게되면 보통 unreachable 메시지로 ICMP 오류 메시지를 받는다.
nmap -sU --top-ports 20 <target ip> 명령어로 스캐닝을 하면
가장 일반적으로 사용되는 상위 20개의 UDP 포트를 스캔할 수 있다.
UDP 포트가 NMAP 스캐닝시 응답을 하지 않는다면, 이는 뭐라고 표시되는가?
open|filtered
- When a UDP port is closed, by convention the target should send back a "port unreachable" message. Which protocol would it use to do so?
NULL, FIN and Xmas 스캔은 잘 사용되지는 않는다.
NULL 스캔은 -sN으로 표현하고, 아무런 flags를 설정하지 않고 보낸다. 닫혀있을 때만 RST를 보낸다.

Flags에 None이라고 표시되어 있음.
FIN 스캔은 -sF으로 표현한다. fin flag를 설정해서 보내고, 일반적으로 연결된 상태에서 보낸다. 이것도 포트가 닫혀있으면 RST를 보낸다.

Fin에만 Set 표시되어 있는 것을 볼 수 있음.
Xmas 스캔은 -sX로 표현한다. xmas 스캐닝은 fin(FIN), push(PSH), urgent(URG) 이렇게 세개의 FLAG를 설정해서 보낸다. 이것도 닫혀 있을 때만 RST 응답이 오고

이 세 개의 스캔은 UDP 스캔과 유사하다. 포트가 열려 있으면 open|filtered로, 닫혀 있으면 RST를 보낸다. 포트가 필터링되었다면 ICMP의 Unreachable packet 메시지도 받을 수 있다.
열린 포트는 원래 응답을 안한다고 배웠는데, 실제로 늘 그렇지는 않다고 한다. Windows에서는 null, fin, xas 같은 스캔은 열린 포트에 RST로 응답한다고 함. 어쨌든 방화벽을 회피하는게 이러한 스캔을 사용하는 목적이다.
-> Why are NULL, FIN and Xmas scans generally used?
-> Which common OS may respond to a NULL, FIN or Xmas scan with a RST for every port?
Task 9: ICMP Network Scanning
블랙박스 테스트에서 첫번째 목표는 타겟 네트워크에 처음 접근시 네트워크 구조의 'map'을 얻는 것. 'ping sweep'이라는 것을 해야한다고 한다. Nmap은 지정된 네트워크의 가능한 ip주소로 ICMP 패킷을 보내는데, 응답이 오면 그 IP 주소를 활성화한 상태로 표시한다.
nmap -sn 192.168.0.1-254
nmap -sn 192.168.0.0/24
이런식으로 표현한다고 한다. (하이픈, CIDR 표기법)
-sn은 nmap이 포트를 스캔하지 않도록 하고, ICMP 에코 패킷을 사용하도록 한다. 또는 포트 443으로 TCP SYN 패킷을 보내고 포트 80으로 TCP ACK 패킷도 보낸다.
Task 10: Overview
nmap에서 사용할 수 있는 스크립트의 집합인 NSE는 Lua라는 프로그래밍 언어로 작성되었다. 취약점에 대한 자동화된 공격을 수행하는 등의 작업을 함.
categories를 알아두자.
safe: - 대상에 영향을 미치지 않음
intrusive: - 안전하지 않음 (대상에 영향을 미칠 가능성이 있음)
vuln: - 취약점 스캔.
exploit: - 취약점 이용하려고 시도
auth: - 실행 중인 서비스의 인증을 우회하려고 시도합니다(예: FTP 서버에 익명으로 로그인).
brute: - 실행 중인 서비스의 자격 증명을 무차별 대입하려고 시도.
discovery: - 네트워크에 대한 추가 정보를 얻기 위해 실행 중인 서비스에 쿼리를 시도.(예: SNMP 서버에 쿼리).
다음 task에서 이 NSE를 어떻게 사용하는지 알아볼 것이라고 한다.
Lua
- Which category of scripts would be a very bad idea to run in a production environment?
어떤 category가 운영 환경에서 실행하는 것이 나쁠까?
intrusive
Task 11: Working with NSE
script 사용하려면
--script=<script-name> 으로 사용하면 됨.
--script=safe
특정 스크립트 실행시
--script=http-fileupload-exploiter
여러개 동시 실행도 가능
--script=smb-enum-users,smb-enum-shares
인수가 필요한 스크립트도 있다.
nmap -p 80 --script http-put --script-args http-put.url='/dav/shell.php',http-put.file='./shell.php'
script-name과 인수 사이에 온점(.)으로 연결.
- What optional argument can the ftp-anon.nse script take?
어떤 선택 인자가 ftp-anon.nse script에 사용되나.
ftp-anon은 default auth safe라는 뜻을 가지고 있다.
즉 대상에게 영향을 끼치지 않는 안전한 스크립트. 익명 FTP 로그인에 사용할 사용자 이름을 지정하는 데 사용한다고 한다.
https://svn.nmap.org/nmap/scripts/ftp-anon.nse
직접 검색해봄.
@args ftp-anon.maxlist The maximum number of files to return in the directory listing. By default it is 20, or unlimited if verbosity is enabled. Use a negative number to disable the limit, or <code>0</code> to disable the listing entirely.
디렉토리 목록에서 반환할 파일의 최대 수. 디폴트는 20, 자세한 정보가 활성화되면 Unlimited라고 함. 제한을 해제하려면 음수를 사용하거나, 목록을 완전히 비활성화하려면 `<code>0</code>`을 사용한다.
어렵다.
Task 12: Searching for scripts
스크립트를 어떻게 찾는지에 대해 알아본다.
nmap 사이트에서 찾는 방법도 있고, /usr/share/nmap/scripts 폴더에서 찾을 수도 있다.
설치된 스크립트를 찾는 방법은 두 가지가 있는데, /usr/shrare/nmap/scripts/script.db 파일이 그 첫번째다. 이건 db보다는 사용가능한 스크립트의 파일 이름과 범주를 포함하는 형식화된 텍스트 파일.
두번째 방법은 ls 커맨드 사용.
ls -l /usr/share/nmap/scripts/*ftp*:
파일명에 ftp가 들어가는 모든 파일 찾아내는 명령어
grep "safe" /usr/share/nmap/scripts/script.db 이렇게도 사용.
What is the filename of the script which determines the underlying OS of the SMB server?

- Read through this script. What does it depend on?

Task 13: Firewall Evasion
우회하기 좋은 방화벽 설정이 있음. 일반적으로 윈도우 호스트는 ICMP 패킷을 차단하는데 Nmap에서 호스트 스캐닝하기 전에 ping을 보내서 활성 상태를 미리 확인한다. 그런데 여기서 "-Pn" 옵션을 사용하면 호스트를 활성 상태로 간주한다고 함.
firewall evasion에 필요한 여러가지 옵션도 있는데, 이 부분은 따로 적지 않았다.
[Research] Which Nmap switch allows you to append an arbitrary length of random data to the end of packets?
Task 14: Practical
이제 연습해 볼 시간이다.
- Does the target ip respond to ICMP echo (ping) requests (Y/N)?

응답이 없다.
- Perform an Xmas scan on the first 999 ports of the target -- how many ports are shown to be open or filtered?
- There is a reason given for this -- what is it?
Note: The answer will be in your scan results. Think carefully about which switches to use -- and read the hint before asking for help!
- Perform a TCP SYN scan on the first 5000 ports of the target -- how many ports are shown to be open?

5개 열려있다.
- Open Wireshark (see Cryillic's Wireshark Room for instructions) and perform a TCP Connect scan against port 80 on the target, monitoring the results. Make sure you understand what's going on. Deploy the ftp-anon script against the box. Can Nmap login successfully to the FTP server on port 21? (Y/N)
사실 와이어샤크를 안 쓴지.. 3년이나 돼서 좀 보다가 바로 script를 사용해봤다.
anonymous에 비밀번호는 빈칸으로 입력했더니 ftp 접속이 됐다.
그러니까 ftp-anon은 anonymous ftp로 접속가능한지 여부를 조사하는 것이니까 이 스크립트를 쓰면 접속이 가능해짐.
Task 15: Conclusion
완료!
난이도는 쉬웠지만 양이 정말 방해하다. script 부분은 계속 틈틈이 공부해야겠다.