RieloUo
[Tip] 원격 시스템의 OS 식별 방법-TCP/IP stack fingerprinting 본문
원격 시스템의 OS 식별 방법
- 가장 간단한 방법 : banner grabbing(배너 수집)을 이용한 방법
- 좀더 전문화된 방법 : TCP/IP stack fingerprinting 기술을 이용한 방법
- 그 외 전통적인 OS 식별 방법
Port Scanning, Banner grabbing, Email Headers, DNS Query, SNMP, Social Engineering 등
TCP/IP stack fingerprinting
TCP 패킷의 TTL과 Window Size를 조합하여 원격 시스템의 OS를 추측할 수 있음
- 대표적인 OS별 Window size
Operating System |
TCP Window Size |
Linux (Kernel 2.4 and 2.6) |
5840 |
Linux 2.4.10 |
5804 |
OpenWrt (Linux 2.6.39) |
14600 |
Windows XP |
65535 |
Windows Vista and 7 (Server 2008) |
8192 |
iOS 12.4 (Cisco Routers) |
4128 |
// [참조]
http://www.hackerschool.org/HS_Boards/view.php?id=Lib_network2&no=22 제목 : Remote OS detection via TCP/IP Stack Fingerprinting 작성자 : fyodor 번역 : 광주 해커즈랩 |
--------[ Phrack Magazine Volume 8, Issue 54 Dec 25th, 1998, article 09 of 12 --------[ Remote OS detection via TCP/IP Stack FingerPrinting --------[ Fyodor <fyodor@dhp.com> (www.insecure.org) October 18, 1998 원격지의 운영체제를 TCP/IP 스택 구조를 통해서 알아보자. 번역: 광주 해커스랩 초보자와 중급자 (Homepage: http://i.am/ttpp) 편집:류성철 oprix@hanmail.net 읽기 전에: 배포는 마음대로 하셔도 되지만 이 글은 저희들의 땀이 서려 있는 글이므로 만든 사람들 이름은 빼 놓지 마시기 바랍니다. 요약 (ABSTRACT) 이 문서는 TCP/IP stack을 이용하는 방법으로 호스트에 관한 귀중한 정보를 모으는 법을 논의한다. 첫 번째로 설명할 건 stack FingerPrinting을 사용하지 않고 호스트 운영체제를 알아내는 몇 가지 고적 적인 방법이다. 그 다음 stack FingerPrinting 도구들의 현재의 상태를 적을 것이다. 다음은 원격인 호스트가 자신의 정보를 누설하는 것에 대하여 많은 기법들을 설명 할 것이다. 마지막으로 나는 nmap의 실행 화면을 가지고 많은 유명한 인터넷 사이트의 운영체제를 알아 볼 것이다. 동기 (REASONS) 시스템이 실행하고 있는 OS를 아는 게 얼마나 유용한지 알려주려고 이 짧은 섹션을 썼다. 큰 이유론 많은 보안상의 구멍이 운영체제의 버전과 관련되었다는 점이다. 자 당신이 침투 테스트를 하고 있고, 포트 53번인 열렸다는 것을 찾았다. 만약 이것이 약점이 있는 Bind 버전이라면 이 방법으로는 데몬이 다운 될 때까지만 해 볼 수 있다. 좋은 TCP/IP fingerprinter가 있다면 재빠르게 이 기계가 솔라리스 2.51 또는 리눅스 2.0.35로 운영되는지 알 수 있고, 알맞은 쉘 코드를 고를 수 있다.(역자 주: 버퍼 오버플로우에 관련된 내용이다.) 더 어려운 경우로 생각해 본다면 누군가 500,000 호스트에 어떤 운영체제가 동작중인지 어떤 포트가 열려 있는지 하는 지 스캐닝 할 경우이다. 그때 누군가 sun comsat daemon에 root 구멍이 있다는 것을 적으면 우리의 초보 크래커는 'UDP/512' 와 'Solaris 2.6' 키워드를 이용해 리스트를 검색해서 루트가 될 수 있는 목록을 얻어 낼 수 있다. 이건 SCRIPT KIDDIE 의 행동일 뿐이다. 기술의 없다고 알려질 수도 있고, 몇몇 제때 구멍이 패치 되지 않은 있는 .edu를 찾은 것에 아무도 관심이 없을 수 있다. 만약 새로 찾은 웹사이트 부에 접근하여 손상을 입히고 당신과 그 관리자가 얼마나 좋고 나쁨을 이야기하는 데도 역시 관심이 없을 수도 있다. 또 다른 경우 사회 공학에 써먹을 수도 있다. 자 당신은 당신의 목표 회사를 스캐닝하고 nmap은 'Datavoice TxPORT PRISM 3000 T1 CSU/DSU 6.22/2.06 ' 이라고 알려준다. 해커는 이제 'Datavoice support'로 전화를 걸고 그들의 PRISM 3000과 같은 몇몇 문제에 대하여 논의 할 것이다. "우리는 보안상의 구멍에 대하여 곧 발표할 것이다, 그러기 전에 첫 번째로 우리는 현재의 고객에게 패치를 설치해야 주어야 한다. -- 나는 방금 이것은 당신에게 메일로 보냈다..." 몇몇 순진한 관리자가 Datavoice를 알고 그만큼 그들의 CSU/DSU에 대하여 아는 실력 있는 엔지니어라고 착각할 수도 있는 것이다. 또 다른 경우는 이걸 사용할 때 평가한 회사가 당신과 거래를 할 때이다. 새로운 ISP를 선택하기 전에, 그들을 스캐닝하고 그들이 무슨 장비를 사용하는지 봐야 한다. 그 연간 99달러라는 거래는 당신이 그들이 쓰잘데기 없는 라우터와 PPP 서비스가 윈도우 박스로 제공되어 진다는 것을 알았을 때 별로 좋지 않게 느껴질 것이다. 고전적인 기술 CLASSICAL TECHNIQUES Stack FingerPrinting은 한 가지 방법으로 OS를 알아 낼 수 있다. 그러나 일반적으로 많은 다른 방법이 있다. 안타깝게도, 이 방법이 그 기술의 여전히 가장 효과적인 방법이다: playground~> telnet hpux.u-aizu.ac.jp Trying 163.143.103.12... Connected to hpux.u-aizu.ac.jp. Escape character is '^]'. HP-UX hpux B.10.01 A 9000/715 (ttyp2) login: 컴퓨터 자체에서 어떤 OS가 돌아가는 지 알려준다면 FingerPrinting은 별로 쓸모가 없다. 안타깝게도, 많은 회사들이 이렇게 어떤 OS가 실행되는지 알도록 첫화면에 놓아둔다. 그리고 많은 시스템 운영자는 그걸 없애지 않는다. 단지 어떤 OS가 작동되고 있는지 FingerPrinting같은 방법으로 알 수 있다고 해서 접속하는 사람들에게 이 정보를 알려주는 건 아니다. 문제는 점점 이런 앞의 정보(배너)를 끄는 관리자가 많아지고 있다는 것이다. 많은 컴퓨터들이 많은 정보를 주지 않기 위해서 배너를 속이는 건 일상적인 일이 되었다. 그래도 비싼 상업용 ISS 스캐너를 쓰는 것보다 이런 배너를 보는 게 당신이 할 수 있는 모든 일이 수 있다. 돈을 아끼기 위해 nmap이나 queso 좀 쓰쇼. 참 쌉니다. :) (역자 주: 광고다. 참고로 nmap은 공짜다.) 많은 배너를 끄더라도 많은 프로그램이 운영체제에 관한 정보를 내준다. 예로 FTP의 예를 들어보자. payfonez> telnet ftp.netscape.com 21 Trying 207.200.74.26... Connected to ftp.netscape.com. Escape character is '^]'. 220 ftp29 FTP server (UNIX(r) System V Release 4.0) ready. SYST 215 UNIX Type: L8 Version: SUNOS 무엇보다 먼저 이 프로그램은 기본 배너에 시스템의 사양을 알려준다. SYST 명령으로 더 세부적인 내용을 알 수 있다. 만약 anonymous ftp를 쓸 수 있다면 /bin/ls나 다른 바이너리를 다운받아서 어떻게 만들어 졌는지 알아낼 수 있다. 프로그램들이 너무 많은 정보를 준다. 예로 웹 서버를 들 수 있다. playground> echo 'GET / HTTP/1.0\n' | nc hotbot.com 80 | egrep '^Server:' Server: Microsoft-IIS/4.0 playground> 어떤 운영체제가 돌고 있는지 알 수가 있다. 다른 고전적인 기술로 DNS 호스트의 정보나 사회 공학이 있다. 만약 161/udp가 작동된다면 CMU SNMP 도구 배포판의 snmpwalk를 이용해서 아주 많은 정보를 알아 낼 수 있다. FingerPrinting 프로그램 (Current FingerPrinting Program) Nmap은 TCP/IP FingerPrinting기법을 이용한 첫 번째 운영체제 식별 프로그램은 아니다. Johan의 버전3 이후의 IRC spoofer sire가 아주 기본적인 FingerPrinting 기술을 보여주고 있다. 버전3 이후의 IRC spoofer sire는 간단한 TCP 플래그 테스트를 사용하여 어떤 호스트가 "LINUX", "4.4BSD", "Win95", 또는 어떤 다른 운영체제인지를 알아낸다. 또 다른 운영체제 식별 프로그램으로는 CodeZero팀의 Shock가 발표한 checkos가 있다. FingerPrinting 테크닉은 SIRC와 똑같고, 많은 부분의 코드까지 동일하다. checkos는 오랜 시간동안 공개버전으로 개인적으로 사용 할 수 있다. checkos에서 추가된 점은 유용하지만 일찍부터 문제점을 가지고 있는 telnet banner checking 부분이다. Suld라는 사람이 또 다른 운영체제 식별 프로그램을 만들었는데, SS라고 부르고 버전 3.11까지 나왔으며, 12개의 서로 다른 운영체제를 구분 할 수 있다. Suld의 SS의 네트워크 코드 부분의 특정 부분은 Fyodor(본 article의 저자)의 nmap program을 사용했다고 한다. 최근의 가장 진보된 형태의 운영체제 식별 프로그램으로 queso를 들 수 있다. queso에서는 두서너 가지의 새로운 테스트 방법을 소개했을 뿐만 아니라, 최초로 운영체제 추측 부분에 해당하는 소스코드 부분을 코드 밖으로 이동 시켰다. /* from ss */ if ((Flagsfour & TH_RST) && (flagsfour & TH_ACK) && (winfour == 0) && (flagsthree & TH_ACK)) reportos(argv[2],argv[3],"Livingston Portmaster ComOS"); 대신 queso는 운영체제 추측 부분에 해당하는 소스코드 부분을 몇 라인의 추가로 쉽게 새로운 운영체제를 첨가할 수 있는 configuration file부분으로 이동시켰다. queso는 Apostols.org의 Savage가 만들었다. 위에서 언급한 프로그램들이 가지고 있는 문제중의 하나는 제한적인 FingerPrinting 테스트이다. 여기서 "제한적이다" 는 의미는 유동성이 부족하다는 말이다. 내가 "특정 machine의 운영체제가 OpenBSD이다 또는 FreeBSD이다" 는 정도 이상의 정보를 알 수 없다는 것이다. 예를 들자면 내가 A라는 machine은 운영체제가 solaris라고만 알아내는 것보다 solaris 2.6이라는 버전 정보까지 알면 더욱 효과적인 대응을 할 수 있을 것이다. 여기서는 이런 유동성을 얻기 위한 여러 가지 테크닉을 다음 섹션에서 언급하기로 하겠다. FingerPrinting 방법론 (FINGERPRINTING METHODOLOGY) 네트워크 스택들의 종류를 알 수 있는 많은 기술들이 있다. 기본적으로, 운영체제들에서 차이점을 발견할 수 있고, 차이점을 검사해서 증거를 발견할 수 있다. 만약 이것들을 그럭저럭 결합시킨다면, 예상되는 운영체제의 종류를 매우 줄일 수 있다. 예를 들어 nmap는 Solaris 2.4, 2.5-2.51, 2.6을 믿을 수 있을 정도로 구별을 한다. 그것은 또한 Linux kernel 2.0.30에서 2.0.31-34 나 2.0.35까지 분간한다. 몇몇 기술들을 알아보자. FIN 조사분석 -- FIN 패킷을(ACK이나 SYN 플래그 없는 어떠한 패킷도 좋다) 열려있는 어떤 포트나 응답을 위해 기다리는 포트로 보낼 수 있다. 정확한 RFC793 의 작동은 응답을 안 하도록 정해졌지만, MS Windows, BSDI, CISCO, HP/UX, MVS, IRIX와 같은 많은 변칙적인 구현들은 RESET을 되돌려 보낸다. 대부분 현재 스캔 도구들은 이 기술을 이용한다. BOGUS 플래그 조사분석 -- Queso(역자 주: 특이한 운영체제 검사기이다. 능동이 아닌 수동 운영체제 검사기. 한 번 써 보길 추천한다.)는 이 현명한 검사(Bogus flag를 말함)를 사용한 첫 번째 스캐너이다. 이 방법은 SYN 패킷으로 된 TCP 헤더 안에 정의되지 않은 TCP 플래그(64 또는 128)를 설정하는 것이다. 2.0.35 이전의 리눅스 박스들은 응답 할 때 여전히 이 플래그 설정을 유지한다. 나는 다른 OS에서 이런 버그를 찾아볼 수 없었다. 그러나, 몇몇 운영체제에서는 그들이 SYN+BOGUS 패킷을 받았을 때 접속이 끊어지는 것을 본 것 같다. 이러한 방법은 그들을 확인할 때 유용하게 쓰일 수 있다. TCP ISN Sampling -- 이 방법은 접속요구에 응답할 때 TCP 구현으로 생기는 ISN(Initail sequence number 역자 주: 딱히 번역할 말이 생각 안 나서 ISN이라 계속 적는다.) 패턴을 찾는 방법이다. 이것은 전통적으로 (많은 구형의 UNIX박스의 경우) 64000이 증가되는 부류, 랜덤한 증가 (Solaris,IRIX,FreeBSD,Digital UNIX,Cray,등등의 새로운 버전)를 갖는 부류와 진정한 "불규칙"인 (linux 2.0,Open VMS, newer AIX, etc) 부류로 나뉜다. 시간에 의존하는 윈도우 박스(그 외 몇 몇 종류) 모델은 정해진 시간동안 ISN의 증가량이 고정되어 있다. 말할 필요도 없이, 이것은 구형의 64K의 경우처럼 쉽게 공격받는다.(역자 주: 예상 할 수 있는 ISN은 IP Spoofing에 취약하다.) 물론, 내가 가장 즐겨 쓰는 기법은 "고정된 수" 이다. 이 운영체제는 항상 같은 ISN을 사용한다. 예로 몇 종류의 3COM사의 허브(0x830을 사용하는)들과 Apple laserWriter Printers(0xC7001을 사용하는 )가 있다. 당신은 계산된 변수와 최대 공약수 숫자들과 순차적인 숫자를 이용한 함수를 이용해서 ISN의 랜덤한 증가를 가지는 운영체제의 종류를 더 자세하게 나눌 수 있다. ISN 생성이 중요한 보안 이슈라는 걸 알아야 한다. 더 알고 싶다면, "security expert"에 접속해보고 SDSC의 Tsutomu "Shimmy" Shimomura 에게서 그의 방법을 물어보라. Nmap은 운영체제 분별에서 이 방법을 처음 사용한 프로그램이다. 패킷 조각 내지 말기(Don't Fragment bit)-- 많은 운영체제들은 패킷을 보내기 시작할 때 자신들이 보내는 패킷에 "조각 내지 말기" 비트를 설정한다. 이건 여러 가지 효율 면에서의 이득이 된다 ( 이건 좀 짜증나는 일이다 -- 이것은 nmap 분할 스캔이 Solaris 박스의 경우 동작하지 않는 이유이다) 어떤 경우는 모든 운영체제들이 이것이 적용되지는 않고, 다른 방식으로 하거나, 상대편 운영체제가 어떻게 반응하는 지 본 다음 이 비트를 설정한다. 나는 전에 어느 쪽도 본적이 없다. TCP 시작 윈도우( 역자 주:이건 마이크로 소프트의 윈도우 시리즈를 의미하는 게 아니다. TCP/IP 구현상 가상의 윈도우를 설정한다.) -- 이것은 단순히 되돌아오는 패킷들의 윈도우 크기와 관련된 방법이다. 오래된 스캐너는 윈도우의 RST 패킷의 크기가 0이 아닌 윈도우를 사용해서 BSD 4.4 계열임을 확인했다. queso 와 nmap 같은 신형스케너들은 이 값이 운영체제 종류에 따라 일정하므로 정확한 윈도우 크기 값을 알려고 애를 쓴다. 이 검사는 실제로 우리에게 많은 정보를 주며, 몇몇 운영체제는 윈도우 크기만으로 알아낼 수 있다. (예를 들어 AIX는 내가 본 것 중 유일하게 0X3F25를 사용한다.) 새롭게 TCP 스택을 고쳐 썼다고 말하는 NT 5는 0x402E를 사용한다. 흥미롭게도, 이것은 openBSD와 FreeBSD도 이 값을 쓴다. ACK 값 -- 비록 완전하게 표준일거라 생각해도, 어떤 경우에 ACK 필드를 사용하는 지에 따라서 다르다. 그 예로, 닫힌 TCP포트에 FIN|PSH|URG를 보내도록 해보자. 윈도우와 어리석은 프린터는 seq+1을 보내고, 대부분의 다른 운영체제의 경우엔 당신이 보낸 ISN과 같은 ISN 값에 ACK Flag를 설정한다. 만약 열린 포트에 SYN|FIN|URG|PSH를 보낸다면 윈도우는 지맘대로 작동한다.(Inconsistent). 때때로 seq로 돌아오거나 다른 때는 seq+1돌아오거나, 다른 때는 전혀 다른 값으로 되돌아온다.(역자 주: 혹시 MS가 TCP 스택에 인공지능을 덧붙인 건 아닐까? ^^; ) 어떻게 만들었길래 이처럼 다양할까 참으로 궁금타... ICMP 에러 메시지 보내기(ICMP Error Message Quenching) -- 몇 몇 좋은 운영 체제는 다양한 에러 메시지를 보내는 비율을 제안된 RFC 1812에 따라 제한한다. (역자 주: DOS 공격 방어책이라고도 볼 수 있다.) 예로, 리눅스 커널(net/ipv4/icmp.h)은 도달 할 수 없는 목적지라는 에러 메시지를 4초마다 80개로 제한하고 이게 초과하면 1/4 초 반응이 느려진다. 이 검사의 한가지 방법은 몇 개의 임의의 높은 UDP포트에 한 묶음의 패킷 보낸 후 되돌아 온 에러 메시지 수를 센다. 나는 사용 한 적을 본 적이 없고 nmap에 기능을 더하지는 않았다.(UDP 포트를 스캔닝할 때 사용하는 것만 빼고) (역자 주: UDP 스캔은 힘들기 때문에 닫힌 포트에 패킷을 보낸 뒤 돌아오는 ICMP 정보를 이용한다. ) 이 검사는 운영체제 탐지를 위해 패킷을 한 묶음 보내고 되돌아오길 기다린다. 그렇지만, 네트웍에서 패킷이 사라지는 가능성도 처리해야 할 것이다. ICMP 메시지 인용 (ICMP Message Quoting) -- RFC는 여러 다양한 에러로 생기는 몇 가지 ICMP 메시지를 인용하는 ICMP 에러 메시지에 대해 적어놓았다. 도달되지 않는 메시지 포트에 대해서, 거의 대부분 운영체제는 오직 IP헤더에 8바이트만 더해서 보낸다. 그러나 솔라리스는 한 비트 더 보내고 리눅스는 더 많이 붙여 보낸다. 이 흥미 있는 점을 이용해 nmap은 열린 포트가 없어도 위의 두 운영체제를 판별한다. (역자 주: 참 신기한 방법입니다. 열린 포트가 없는 데도 어케 알아내나 했는데..) ICMP 에러 메시지를 되돌려주는 무결성(ICMP Error message echoing integrity) -- comp.security.unix에 게재된 Theo De Raadt의 글이 영감을 주었다. 앞서 말한 것처럼 운영체제는 도달할 수 없는 포트란 에러를 덧 붙여 메시지를 되돌려 보낸다. 아직도 어떤 운영체제는 작동하는 동안에 상대방의 헤더부분을 기반으로 (역자 주:scratch space 뜻을 잘 모르겠다. ) 사용하는 경향이 있어서 그들을 되돌려 주면서 약간의 차이가 있게 된다. 예를 들면 AIX 와 BSDI는 IP 전체 길이를 20 바이트 더 높게 해서 돌려보낸다. 어떤 BSDI, FreeBSD, OpenBSD, ULTRIX, 와 VAXen 은 당신이 보낸 IP ID를 엉망으로 만든다. TTL이 변하기 때문에 checksum이 바뀌는 반면에, 어떤 운영체제들(AIX, FreeBSD)은 아무 값이나 돌려보내거나 0 체크 섬을 돌려보낸다. UDP 체크 섬도 마찬가지다. 백이면 백 NMAP는 이처럼 미묘한 차이를 알아차리는 ICMP에러 상에서 9개의 다른 검사를 행한다 서비스 유형(Type of Service) -- 되돌아오는 도달할 수 없는 ICMP 메시지 부분에서 서비스의 종류에 관한 부분에서 정보를 얻을 수 있다. 대부분의 모든 운영체제들은 0xc0를 사용하는 리눅스를 빼고, ICMP 에러로 0을 사용한다. 이것은 표준 TOS 값이 이렇다는 것은 아니다. 그러나 사용치 않은 상위필드의 한 부분을 나타낸다. 나는 왜 이것이 설정되어 있는지 모른다. 그러나 만약 그것들이 0으로 변한다면, 구버전을 확인하도록 유지할 수 있을 것이고 이 방법으로 신(new) 구(old)를 확인할 수 있을 것이다. 조각 관리(Fragmentation Handling)-- 이것은 Thomas H가 특히 잘하는 기술이다. Ptacek of Secure Networks, Inc 보안 네트워크의 Ptacek,Inc ( 지금은 NAI 의 윈도우 사용자들의 소유이다.) 소속이다. 이것은 각기 다른 운영체제들이 종종 IP 조각들을 달리 덮어쓴다는 사실을 이용한다. 어떤 것은 구버전의 부분에 새로운 것을 덮어쓸 것이다. 그리고 어떤 경우에는 그 반대일 수 있다. 패킷이 어떻게 다시 조합되는지 알 수 있는 많은 다른 검사들이 있다. IP 조각 모으기(특히 골치 아픈 솔라리스 상에서)를 하는 간편한 방법을 알지 못하기 때문에 이런 성능을 덧붙일 수 없다. 조각들 덮어쓰기에 대해서 더 많은 정보를 알려면 IDS paper (www.secnet.com)를 읽어보라. TCP 옵션들(TCP Options) -- 이 옵션들은 정보의 누출이라는 점에서 아주 좋다. 이 옵션들의 매력은 다음과 같다. 1)그것들은 모든 운영체제들이 구현되지 않은 일반적으로 선택적인 것이다. 2)운영체제에 옵션에 설정된 대로 질문을 보내서 그것들을 실행한다면 구별할 수 있다. 그 목표 운영체제는 일반적으로 그것의 응답에 설정된 옵션의 지원하는지를 보여준다. 3)당신은 한번에 모든 것을 검사 할 수 있도록 하나의 패킷에 모든 옵션을 가득 채울 수 있다. Nmap은 거의 모든 시험 패킷과 함께 이러한 옵션들을 보낸다. Window Scale=10; NOP; Max Segment Size = 265; Timestamp; End of Ops; 당신이 당신의 응답을 얻었을 때, 어떤 옵션이 되돌아 왔는지 보고 지원되는 걸 알 수 있다. 요즘 FreeBSD box들과 같은 어떤 운영체제들은 위의 모든 것을 지원하나, 반면 다른 Linux2.0x와 같은 것들은 매우 적게 지원한다. 최신의 Linux 2.1.x 커널들은 위의 모든 것들을 지원한다. 반면에 그것들은 TCP sequence prediction(역자 주: ISN 값을 예측하기가 더 쉽다는 얘기로 생각된다.) 에 더 취약하다. 여러 개의 운영체제들이 같은 옵션들을 지원하더라도 , 옵션들의 _values_으로 때로는 운영체제들을 구분할 수 있다. 예를 들어, linux box에 작은 MSS값을 보낸다면, 당신에게 반대로 MSS를 대개 다시 보낼 것이다. 다른 호스트들은 다른 값들을 보내 것이다. 같은 옵션과 같은 값을 보내도 그 옵션의 순서를 보고 구별할 수 있다. 예로 솔라리스는 NNTNWME 값을 <no op><no op><timestamp><no op><window scale><echoed MSS> 되돌리지만, 리눅스 2.1.122는 NENNTNW를 되돌린다.(역자 주: <no op><echoed MSS><no op><no op><timestamp><no op><window scale> 이렇게 보내준다는 말이다.) 같은 옵션들, 같은 값들, 그러나 다른 순서이다! 필자는 TCP옵션들을 이용하는 다른 OS 탐지 툴들을 본적이 없다. 그러나 이 방법은 매우 유용하다. T/TCP와 선택적인 승인들과 같이, 어떤 점에서 운영체제를 구별 할 수 있는 되는 다른 유용한 옵션들이 몇 가지 있다. Exploit 연대기(Exploit Chronology) -- 심지어 위의 것들을 검사할지라도, nmap은 Win95,WinNT, Win98의 TCP스택들을 구별한다는 것은 불가능하다.(역자 주: 웃음이 나온다.) 이것은 다소 놀라운 일이다. 특히 Win98이 Win95 4년후정도에 나왔기 떄문이다. 그들이 어떤 방법(TCP 옵션을 늘리는 방법 같은)을 귀찮을 정도로 발전시켜서 우리가 그 변화를 탐지하고 운영체제를 검사 할 수 있겠지 라고 생각할 지도 모른다. (역자 주: 원문이 말이 안되서 그럭저럭 말 되게 해 놓았다.) 불행하게도 그 경우는 아니다. NT스택은 Win95에 끼워있는 스택과 외관상으로 같은 시시한 스택이다. 그리고 98을 위해서 스택을 업그레이드하는 것을 생각도 안 했다. 그러나 희망을 포기하지마라, 해결책이 있다. 윈도우에 DOS 공격(Ping of Death, Winnuke 등)과 같이 간단하게 시작할 수 있는 방법이나, 좀 더 향상된 Teardrop과 Land와 같은 공격들을 해보면 된다. 간단하게, 공격하고 ping으로 검사해서 그것들이 마침내 다운 될 때, 어느 운영체제가 작동하는지 알 수 있다. 나는 nmap에 이러한 기능들을 추가하지 않았다. 그치만 추가하고 싶당. :) SYN Flood Resistance -- 어떤 운영체제는 너무 많이 위조된 SYN 패킷을 보내면 새로운 연결을 거부한다.(물론 커널이 연결을 끊어버릴 정도의 양을 피해서 보내도 말이다.) 많은 운영체제들이 단지 8개의 패킷들을 다룰 수 있다. 최근 리눅스 커널들은(다른 운영체제들 중에서 ) SYN 쿠키와 같은 심각한 문제를 방지하기 위해 다양한 방법을 사용한다. 그러므로 열려진 포트에 위조한 주소로부터 8개의 패킷을 보내고 그때 당신의 운영체제에서 연결이 가능한지 검사해서 목표 운영체제에 관해 알 수 있다. 이것은 SYN flood(역자 주: 서비스 거부 공격의 하나이다.) 기술로 상대 운영체제가 마비될 수 있기 때문에 nmap에 구현하고 있지 않다. 당신이 어떤 운영체제인지를 알아내기 위해 시험하는 것조차도 그들을 조용하게(역자 주: 다운되었다는 말 ^^; ) 만들 수 있다. Nmap 실행과 결과 (NMAP IMPLEMENTATION AND RESULTS) 위에서 언급했던 운영체제 감지 기술을 가진 프로그램을 만들었다.(내가 배제한 것들을 제외한다.)이미 알고 있듯이 FingerPrinting을 위해 어느 포트가 열리고 닫히는 아는 방법을 nmap scanner에 추가했고 그에 대해 자세히 얘긴 하지 않는다. 이걸 Linux, *BSD,그리고 Solaris 2.51과 2.6 그리고 다른 운영체제 사이에 포팅 시키는 건 간단하다. nmap의 새로운 버젼은 간단한 문법으로 구성된 Fingerprint templates(틀)로 구성된 파일을 읽는다. 다음은 보기이다 : *Fingerprint IRIX 6.2 - 6.4 # Thanks to Lamont Granquist *TSeq(Class=i800) *T1(DF=N%W=C000|EF2A%ACK=S++%Flags=AS%Ops=MNWNNT) *T2(Resp=Y%DF=N%W=0%ACK=S%Flags=AR%Ops=) *T3(Resp=Y%DF=N%W=C000|EF2A%ACK=O%Flags=A%Ops=NNT) *T4(DF=N%W=0%ACK=O%Flags=R%Ops=) *T5(DF=N%W=0%ACK=S++%Flags=AR%Ops=) *T6(DF=N%W=0%ACK=O%Flags=R%Ops=) *T7(DF=N%W=0%ACK=S%Flags=AR%Ops=) *PU(DF=N%TOS=0%IPLEN=38%RIPTL=148%RID=E%RIPCK=E%UCK=E%*ULEN=134%DAT=E 첫 번째 줄을 보자 (관련 부분에 '>'을 표시): > FingerPrint IRIX 6.2 - 6.3 # Thanks to Lamont Granquist 이것은 간단히 fingerprint가 IRIX 6.2부터 6.3 버전까지 지원한다는 걸 말한다. 그 다음 해석부분은 Lamont Granquist가 친절하게도 나에게 IP주소를 보내주었고 IRIX에서 Fingerprints를 테스트해 준걸 말하고 있다. *> TSeq(Class=i800) 이것은 ISN(Interal Sequence Number)표본이 i800 class안에 있다는 걸 의미한다. 이것은 각각의 새로운 ISN이 그 전 마지막 ISN보다 800의 배수정도로 커진다는 걸 뜻한다. *> T1(DF=N%W=C000|EF2A%ACK=S++%Flags=AS%Ops=MNWNNT) 테스트는 T1이라 하고 이 테스트에서 우리는 SYN패킷과 함께 TCP옵션을 open port로 보낸다.DF=N 은 응답에 "Don't fragment"bit를 고정되어 있지 않다는 걸 의미한다. W=C000|EF2A은 우리가 받은 window 반환값이 0xC000 또는 EF2A라야 한다는 걸 의미한다. ACK=S++은 우리가 받는 긍정 응답 값이 ISN에 1씩 더해진다는 걸 의미한다. Flags = AS 는 ACK나 SYN flags가 응답에 보내진다는 걸 의미한다. Ops = MNWNNT는 응답 속의 옵션이 다음 순서로 된다는 걸 의미한다. <MSS (not echoed)><NOP><Window scale><NOP><NOP><Timestamp> *> T2(Resp=Y%DF=N%W=0%ACK=S%Flags=AR%Ops=) 테스트 2는 T1과 같은 상황 하에서 open port에 NULL값을 보낸다. Resp=Y는 응답 값을 얻는다는 걸 말한다. Ops=는 응답 패킷에 어떤 옵션도 포함되지 않는다는 걸 말한다. '%Ops='를 빼면 보낸 어떤 옵션이고 가능하다란 말이다. *> T3(Resp=Y%DF=N%W=400%ACK=S++%Flags=AS%Ops=M) Test 3은 하나의 open port에 SYN|FIN|URG|PSH w/options를 보내는 걸 의미한다. *> T4(DF=N%W=0%ACK=O%Flags=R%Ops=) 이것은 open port에 자동 응답을 한다. 여기에 Resp= 가없다는 걸 주의해라. 이것은 네크워크 또는 나아쁜 방화벽 때문에 생긴 버려진 패킷 같은 응답의 부족에도 다른 검사가 끝나기 전까지 판단을 미룬다. 어떠한 컴퓨터도 대답을 한다고 생각하기 때문에 이런 옵션을 둔다. 응답의 부족은 네트워크 상태의 속성이지 운영체제 자체의 속성은 아니다. 어떤 운영체제들은 응답 없이 그것들을 버리기 때문에 우리는 Test 2 그리고 3 에 Resp tag를 넣는다. *> T5(DF=N%W=0%ACK=S++%Flags=AR%Ops=) *> T6(DF=N%W=0%ACK=O%Flags=R%Ops=) *> T7(DF=N%W=0%ACK=S%Flags=AR%Ops=) 이들 테스트는 닫혀진 port에 각각 SYN, ACK, and FIN|PSH|URG을 할당한다. 항상 같은 옵션이 지정된다. 물론, 이것들을 T5, T6, 그리고 T7으로 이름지었다. *> PU(DF=N%TOS=0%IPLEN=38%RIPTL=148%RID=E%RIPCK=E%UCK=E%ULEN=134%DAT=E) 이 길다란 명령은 'port unreachable'(도달할 수 없는)라는 메시지 테스트이다. DF=N을 생각해 보자. TOS=0은 서비스 필드와 IP값이 0이라는 뜻. 다음 두 개의 필드는 IP헤더의 메시지 길이와 상대 운영체제들이 우리에게 다시 돌려주는 IP헤더 길이의 값을 조사하라는 말이다. RID=E는 초기의 UDP패킷 복사본에서 우리가 다시 되돌려주는 RID값이 우리가 보낸 것과 일치하는가 조사하라는 말이다. RIPCK=E는 checksum(확인값, 반복값)이 변경되지 않는 걸 의미한다.(만약에 변경된다면 RIPCK=F라고 적는다) UCK=E는 UDP checksum이 정확하다는 걸 의미한다. 다음에 오는 0x134이라는 UDP 길이와 DAT=E은 정확하게 우리의 UDP data값을 되돌려 주는 지를 의미한다. 이 경우를 포함한 대부분의 프로그램이 어떤 UDP data도 돌려주지 않기 때문에 기본적으로 DAT=E라 기술한다. 이 기능을 가진 nmap은 현재 6번째 베타버전이다. 당신이 Phrack안의 이것을 읽을 때는 6번째 이후일수 있고 아닐수 있다. 최종 version을 보려면 이곳을 보아라. http://www.insecure.org/nmap/ 인기 있는 사이트의 탐색 (POPULAR SITE SNAPSHOTS) 여기 모든 노력에 대한 재미있는 결과가 있다. 우리는 지금 아무 인터넷 사이트를 조사하거나, 그들이 사용하고 있는 운영체제를 알아 볼 수 있다. 사적인 정보를 보호하기 위하여 많은 사람들이 Telnet 정보를 막아놓았지만, nmap에게는 무용지물이다. nmap은 쓰레기 같은 운영체제를 사용하는 시대에 뒤처진 사용자들을 판단할 수 있는 좋은 프로그램이다.(역자 주: 자기 자랑이다. -_-; ) 명령 사용예 : nmap -sS -p 80 -O -v <host> 대부분의 아래 기록은 1998년 10월 18일 기록이다. 이 후로 서버들이 업그레이드되거나 변경되었을 것이다. 나는 아래의 모든 사이트를 다 좋아하진 않는다. #해커 사이트 혹은 보안 사이트의 운영체제에 대한 그들의 생각이다. www.l0pht.com => OpenBSD 2.2 - 2.4 www.insecure.org => Linux 2.0.31-34 www.rhino9.ml.org => Windows 95/NT www.technotronic.com => Linux 2.0.31-34 www.nmrc.org => FreeBSD 2.2.6 - 3.0 www.cultdeadcow.com => OpenBSD 2.2 - 2.4 www.kevinmitnick.com => Linux 2.0.31-34 www.2600.com => FreeBSD 2.2.6 - 3.0 Beta www.antionline.com => FreeBSD 2.2.6 - 3.0 Beta www.rootshell.com => Linux 2.0.35 # 보안 관련 www.repsec.com => Linux 2.0.35 www.iss.net => Linux 2.0.31-34 www.checkpoint.com => Solaris 2.5 - 2.51 www.infowar.com => Win95/NT # 보안 판매자들은 자신의 OS에 애착을 가지고 있었다. www.li.org => Linux 2.0.35 www.redhat.com => Linux 2.0.31-34 # redhat 배포판을 쓰고 있을까? www.debian.org => Linux 2.0.35 www.linux.org => Linux 2.1.122 - 2.1.126 www.sgi.com => IRIX 6.2 - 6.4 www.netbsd.org => NetBSD 1.3X www.openbsd.org => Solaris 2.6 www.freebsd.org => FreeBSD 2.2.6-3.0 Beta # 아이비 리그(Ivy league) www.harvard.edu => Solaris 2.6 www.yale.edu => Solaris 2.5 - 2.51 www.caltech.edu => SunOS 4.1.2-4.1.4 # 완존 옛날 거다. www.stanford.edu => Solaris 2.6 www.mit.edu => Solaris 2.5 - 2.51 #많은 좋은 학교들은 썬을 선호하게 되었다. 아마 .edu의 40% 정도나 되었다. www.berkeley.edu => UNIX OSF1 V 4.0,4.0B,4.0D www.oxford.edu => Linux 2.0.33-34 #시대에 뒤진 사이트 www.aol.com => IRIX 6.2 - 6.4 # 음 매우 안전하군요? ^^ www.happyhacker.org => OpenBSD 2.2-2.4 대부분 보안 OS는 무능한 관리자에게는 유용하지 못하다. # 잡동사니 www.lwn.net => Linux 2.0.31-34 www.slashdot.org => Linux 2.1.122 - 2.1.126 www.whitehouse.gov => IRIX 5.3 sunsite.unc.edu => Solaris 2.6 Note: 그들의 보안 백서에서. Microsoft는 자신들의 보안은 모자라다라고 한다.: 겚瀏망嗤 예상으로는 시간이 갈수록 그 보안이 발전해서 큰 인기를 얻을 것이다. (역자 주: 웃긴다.) 내 근처의 보안 공동체에서는 윈도우는 그리 별 인기가 없다. 나는 단지 전체 그룹에서 2개의 윈도우 박스를 보았고, 자주 다운이 되어서 구별이 쉬웠다. 그리고 물론 그곳에는 우리가 알아 둘 한 사이트가 더 있다. 그 곳은 아주 비밀스런 Transmeta 법인의 웹사이트이다. 그 회사는 마이크로소프트사의 폴 안렌이 거금을 투자했다.그러나 리누즈 토발즈를 고용했다. 그래서 그들이 폴에 얽매여 NT를 키울 것인가 아니면 리눅스 혁명에 가입하고 동참 할 것인가.? 지켜보자.(역자 주: 알다시피 이 회사는 크루소라는 인텔 호환 칩(?)을 만들어 냈다. 시장에서 어떻게 볼지는 더 두고 봐야 한다.) 아래의 명령을 사용해 보았다. nmap -sS -F -o transmeta.log -v -O www.transmeta.com/24 위 명령은 로그 결과를 transmeta.log에 저장하고 /etc/services를 이용해 알려진 포트를 SYN Scan 한다. www.transmeta.com가 있는 C 클래스의 운영체제를 조사하고 출력한다. 자! 결과가 여기있다. neon-best.transmeta.com (206.184.214.10) => Linux 2.0.33-34 www.transmeta.com (206.184.214.11) => Linux 2.0.30 neosilicon.transmeta.com (206.184.214.14) => Linux 2.0.33-34 ssl.transmeta.com (206.184.214.15) => 리눅스 알려지지 않은 버전 linux.kernel.org (206.184.214.34) => Linux 2.0.35 www.linuxbase.org (206.184.214.35) => Linux 2.0.35 나는 위의 대답이 (검색된 사이트) 우리의 질문에 명확한 답이라고 생각한다. (역자 주: 리눅스에서 크루소 칩이 더 잘 돌 거라는 토발즈의 우스개 말이 있었다.) 감사 ACKNOWLEDGEMENTS Nmap이 현재 매우 많은 다른 운영체제를 찾아낼 수 있는 단 한가지 이유는 매우 많은 개인적인 팀에 있는 사람들이 새롭고 흥미 있는 fingerprint 할 컴퓨터를 찾아내는데 노력을 기울이고 있어서이다. 특히 Jan Koum, van Hauser, Dmess0r, David O'Brien, James W. Abendschan, Solar Designer, Chris Wilson, Stuart Stock, Mea Culpa, Lamont Granquist, Dr. Who, Jordan Ritter, Brett Eldridge, and Pluvius 등은 인터넷에 물려있거나 그렇지 않은 독특한 운영체제를 찾아 Fingerprint한 엄청난 양의 정보를 보내준다. GNU Emacs를 쓴 것에 대해 Richard Stallman께 감사 드린다. 당신이 vi나 cat 그리고 ^d를 쓰고 있다면 이 글은 보기에 썩 좋은 글은 못 될 것이다. 질문과 주석을 fyodor@DHP.com으로 보낼 수 있다.(만약 어떤 이유로 작동을 하지 않는다면 fyodor@insecure.org 메일을 보내주라). Nmap은http://www.insecure.org/nmap로 얻을 수 있다. 역자 왈: 좋은 프로젝트를 시작하신 KHDP 관계자 여러분께도 감솨 ^^
'Tip' 카테고리의 다른 글
[링크] 악성코드 샘플 다운로드 사이트 모음 (0) | 2017.06.04 |
---|---|
[Tip] 와이어샤크 GeoIP 연동 (IP 국가정보 파악 용이) (0) | 2017.02.08 |
[Tip] NTFS ADS(Alternate Data Stream) (0) | 2016.06.07 |