쇼단 엔진의 경우, 네트워크에 연결되어있는 장치들 - IoT 장치들을 조회해주고 해당 장치들에 대한 취약점 - CVE 등을 확인해서 보여주는 역할을 한다.
hostname 이나 IP 주소 등을 이용하여 장치 정보 확인 및 취약점 확인이 가능하기 때문에 IoT 계 구글이라고도 불리긴 한다.
Shodan 엔진의 알고리즘은 생각보다 간단하다.
- 무작위 IPv4 주소를 생성
- 쇼단의 인식 포트 목록 내 테스트 임의 포트 생성
- 임의 포트 내 무작위 IPv4 주소를 확인하고 베너 값 호출
- 1번으로 돌아가 반복
굉장히 많은 기술을 요한다 생각하였으나, 생각보다 간단했다.
엔진에서 배너 값을 기준으로 데이터를 수집하다 보니, 기본 데이터 단위는 배너 값이되는데, 웹 서버의 경우 반환 헤더 값으로 설정되며, Telnet 의 경우 로그인 화면이 된다. 때문에 쇼단에서 처리하는 배너 값은 서비스 유형에 따라 달라진다.
ex01. HTTP Banner
HTTP/1.1 200 OK
Server: nginx/1.1.19
Date: Sat, 03 Oct 2015 06:09:24 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 6466
Connection: keep-alive
해당 예시의 배너는 NGINX 1.1.19 버전을 사용하고 있는 웹 서버 장치를 나타낸다.
여기에서 웹 모의해킹 컨설턴트들은 서버 정보 노출 취약점으로 식별할 수 있을 것이다.
ex02. Simens S7 Application Protocal Banner
Copyright: Original Siemens Equipment
PLC name: S7_Turbine
Module type: CPU 313C
Unknown (129): Boot Loader A
Module: 6ES7 313-5BG04-0AB0 v.0.3
Basic Firmware: v.3.3.8
Module name: CPU 313C
Serial number of module: S Q-D9U083642013
Plant identification:
Basic Hardware: 6ES7 313-5BG04-0AB0 v.0.3
HTTP 와 다르게 Simens S7 프로토콜을 굉장히 다른 배너 값을 반환 시키며, 배너 값으로 펌웨어 버전 정보 및 일련 번호/장치 설명 값에 대한 정보를 제공한다.
Shodan 에서 특정 대상에 대한 정보를 추출하고자 하는 경우, 배너 값이 모두 다르므로 해당 대상의 유형을 결정하여 진행해야한다. 물론 일반적인 취약점 분석 시에는 웹 서버나 모바일 대상으로 진행하는 경우가 있어 두 가지만 파악하고 사용하면 되겠지만 블랙박스 등 특정 그룹이나 서비스 전체에 대해 모의해킹을 진행하는 경우엔 부가적인 판단이 필요하다.
- 여기에서 단일 IP에서 여러 서비스를 노출시키고 있는 경우엔 단 1개가 아닌 여러 개 값 도출이 요구되므로 배너 값을 따로 검색을 하던가, 운영체제를 이용하여 검색하는 방법 등이 요구되겠다.
배너 이외 쇼단은 지리적 위치나 호스트 명, 운영 체제 등과 같은 데이터 정보를 이용해 메타 데이터를 수집한다. 대부분의 메타 데이터는 주요 Shodan 웹 사이트나 Shodan 에서 제공하는 API를 이용하여 검색이 가능하다.
- Shodan Metadata Example
{
"_shodan": {
"id": "7383056c-d513-4b43-8734-b82d897888e6",
"options": {},
"ptr": true,
"module": "dns-udp",
"crawler": "9d8ac08f91f51fa9017965712c8fdabb4211dee4"
},
"hash": -553166942,
"os": null,
"opts": {
"raw": "34ef818200010000000000000776657273696f6e0462696e640000100003"
},
"ip": 134744072,
"isp": "Google",
"port": 53,
"hostnames": [
"dns.google"
],
"location": {
"city": null,
"region_code": null,
"area_code": null,
"longitude": -97.822,
"country_code3": null,
"country_name": "United States",
"postal_code": null,
"dma_code": null,
"country_code": "US",
"latitude": 37.751
},
"dns": {
"resolver_hostname": null,
"recursive": true,
"resolver_id": null,
"software": null
},
"timestamp": "2021-01-28T07:21:33.444507",
"domains": [
"dns.google"
],
"org": "Google",
"data": "\nRecursion: enabled",
"asn": "AS15169",
"transport": "udp",
"ip_str": "8.8.8.8"
}
네트워크 관련 엔진답게 IPv6 에 대한 데이터도 수집하며 SSL에 대한 심층 분석 또한 가능하다. Shodan 은 SSL 지원 서비스또한 수집하고 정보를 확장하며, HTTPS 와 같은 SSL 서비스 배너에 SSL 인증서를 포함한 정보 또한 제공하고 저장한다.
- Shodan SSL Banner Example
{
"hostnames": [],
"title": "",
"ip": 2928565374,
"isp": "iWeb Technologies",
"transport": "tcp",
"data": "HTTP/1.1 200 OK\r\nExpires: Sat, 26 Mar 2016 11:56:36 GMT\r\nExpire\
s: Fri, 28 May 1999 00:00:00 GMT\r\nCache-Control: max-age=2592000\r\nCache-Cont\
rol: no-store, no-cache, must-revalidate\r\nCache-Control: post-check=0, pre-che\
ck=0\r\nLast-Modified: Thu, 25 Feb 2016 11:56:36 GMT\r\nPragma: no-cache\r\nP3P:\
CP=\"NON COR CURa ADMa OUR NOR UNI COM NAV STA\"\r\nContent-type: text/html\r\n\
Transfer-Encoding: chunked\r\nDate: Thu, 25 Feb 2016 11:56:36 GMT\r\nServer: sw-\
cp-server\r\n\r\n",
"asn": "AS32613",
"port": 8443,
"ssl": {
"chain": ["-----BEGIN CERTIFICATE-----\nMIIDszCCApsCBFBTb4swDQYJKoZIhvcN\
AQEFBQAwgZ0xCzAJBgNVBAYTAlVTMREw\nDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHSGVybmRvbj\
ESMBAGA1UEChMJUGFy\nYWxsZWxzMRgwFgYDVQQLEw9QYXJhbGxlbHMgUGFuZWwxGDAWBgNVBAMTD1Bh\
cmFs\nbGVscyBQYW5lbDEhMB8GCSqGSIb3DQEJARYSaW5mb0BwYXJhbGxlbHMuY29tMB4X\nDTEyMDkx\
NDE3NTUyM1oXDTEzMDkxNDE3NTUyM1owgZ0xCzAJBgNVBAYTAlVTMREw\nDwYDVQQIEwhWaXJnaW5pYT\
EQMA4GA1UEBxMHSGVybmRvbjESMBAGA1UEChMJUGFy\nYWxsZWxzMRgwFgYDVQQLEw9QYXJhbGxlbHMg\
UGFuZWwxGDAWBgNVBAMTD1BhcmFs\nbGVscyBQYW5lbDEhMB8GCSqGSIb3DQEJARYSaW5mb0BwYXJhbG\
xlbHMuY29tMIIB\nIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxc9Vy/qajKtFFnHxGOFPHTxm\
\nSOnsffWBTBfyXnK3h8u041VxvZDh3XkpA+ptg2fWOuIT0TTYuqw+tqiDmg8YTsHy\njcpMFBtXV2cV\
dhKXaS3YYlM7dP3gMmkGmH+ZvCgCYc7L9MIJxYJy6Zeuh67YxEMV\ngiU8mZpvc70Cg5WeW1uBCXtUAi\
jDLsVWnhsV3YuxlweEvkRpAk3EHehKbvgMnEZS\nQ30QySe0GAqC7bWzKrwsJAOUk/+Js18+3QKb/LmD\
a9cRjtFCTo6hYfPbfHj8RxQh\n4Xmnn/CtZ48wRQTqKXSO6+Zk3OuU7/jX1Gt/jxN6n77673e6uCsggT\
wut/EtNwID\nAQABMA0GCSqGSIb3DQEBBQUAA4IBAQBb/yTy76Ykwr7DBOPAXc766n73OsZizjAt\n1k\
mx7LxgN3X/wFxD53ir+sdOqbPgJl3edrE/ZG9dNl6LhUBbUK+9s6z9QicEfSxo\n4uQpFSywbGGmXInE\
ZmyT4SsOLi/hNgy68f49LO1h6rn/p7QgIKd31g7189ZfFkFb\nRdD49s1l/Cc5Nm4XapUVvmnS91MlPk\
/OOIg1Lu1rYkuc8sIoZdPbep52H3Ga7TjG\nkmO7nUIii0goB7TQ63mU67+NWHAmQQ8CtCDCN49kJyen\
1WFjD6Je2U4q0IFQrxHw\nMy+tquo/n/sa+NV8QOj1gMVcFsLhYm7Z5ZONg0QFXSAL+Eyj/AwZ\n----\
-END CERTIFICATE-----\n"],
"cipher": {
"version": "TLSv1/SSLv3",
"bits": 256,
"name": "DHE-RSA-AES256-GCM-SHA384"
},
"alpn": [],
"dhparams": {
"prime": "b10b8f96a080e01dde92de5eae5d54ec52c99fbcfb06a3c69a6a9dca52\
d23b616073e28675a23d189838ef1e2ee652c013ecb4aea906112324975c3cd49b83bfaccbdd7d90\
c4bd7098488e9c219a73724effd6fae5644738faa31a4ff55bccc0a151af5f0dc8b4bd45bf37df36\
5c1a65e68cfda76d4da708df1fb2bc2e4a4371",
"public_key": "2e30a6e455730b2f24bdaf5986b9f0876068d4aa7a4e15c9a1b9c\
a05a420e8fd3b496f7781a9423d3475f0bedee83f0391aaa95a738c8f0e250a8869a86d41bdb0194\
66dba5c641e4b2b4b82db4cc2d4ea8d9804ec00514f30a4b6ce170b81c3e1ce4b3d17647c8e5b8f6\
65bb7f588100bcc9a447d34d728c3709fd8a5b7753b",
"bits": 1024,
"generator": "a4d1cbd5c3fd34126765a442efb99905f8104dd258ac507fd6406c\
ff14266d31266fea1e5c41564b777e690f5504f213160217b4b01b886a5e91547f9e2749f4d7fbd7\
d3b9a92ee1909d0d2263f80a76a6a24c087a091f531dbf0a0169b6a28ad662a4d18e73afa32d779d\
5918d08bc8858f4dcef97c2a24855e6eeb22b3b2e5",
"fingerprint": "RFC5114/1024-bit MODP Group with 160-bit Prime Order\
Subgroup"
},
"versions": ["TLSv1", "-SSLv2", "SSLv3", "TLSv1.1", "TLSv1.2"]
},
"html": "\n\t\t<html><head>\n\t\t<meta charset=\"utf-8\">\n\t\t<meta http-eq\
uiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">\n\t\t<title></title>\n\t\t\
<script language=\"javascript\" type=\"text/javascript\" src=\"/javascript/commo\
n.js?plesk_version=psa-11.0.9-110120608.16\"/></script>\n\t\t<script language=\"\
javascript\" type=\"text/javascript\" src=\"/javascript/prototype.js?plesk_versi\
on=psa-11.0.9-110120608.16\"></script>\n\t\t<script>\n\t\t\tvar opt_no_frames = \
false;\n\t\t\tvar opt_integrated_mode = false;\n\t\t</script>\n\t\t\n\t\t</head>\
<body onLoad=\";top.location='/login.php3?window_id=&requested_url=https%3A%\
2F%2F174.142.92.126%3A8443%2F';\"></body><noscript>You will be redirected to the\
new address in 15 seconds... If you are not automatically taken to the new loca\
tion, please enable javascript or click the hyperlink <a href=\"/login.php3?wind\
ow_id=&requested_url=https%3A%2F%2F174.142.92.126%3A8443%2F\" target=\"top\"\
>/login.php3?window_id=&requested_url=https%3A%2F%2F174.142.92.126%3A8443%2F\
</a>.</noscript></html><!--_____________________________________________________\
________________________________________________________________________________\
________________________________________________________________________________\
_________________________IE error page size limitation__________________________\
________________________________________________________________________________\
________________________________________________________________________________\
____________________________________________________-->",
"location": {
"city": null,
"region_code": "QC",
"area_code": null,
"longitude": -73.5833,
"country_code3": "CAN",
"latitude": 45.5,
"postal_code": "H3G",
"dma_code": null,
"country_code": "CA",
"country_name": "Canada"
},
"timestamp": "2016-02-25T11:56:52.548187",
"domains": [],
"org": "iWeb Technologies",
"os": null,
"_shodan": {
"options": {},
"module": "https",
"crawler": "122dd688b363c3b45b0e7582622da1e725444808"
},
"opts": {
"heartbleed": "2016/02/25 03:56:45 ([]uint8) {\n 00000000 02 00 74 63 6\
5 6e 73 75 73 2e 73 68 6f 64 61 6e |..tcensus.shodan|\n 00000010 2e 69 6f 53 \
45 43 55 52 49 54 59 20 53 55 52 56 |.ioSECURITY SURV|\n 00000020 45 59 fe 7a\
a2 0d fa ed 93 42 ed 18 b0 15 7d 6e |EY.z.....B....}n|\n 00000030 29 08 f6 f\
8 ce 00 b1 94 b5 4b 47 ac dd 18 aa b9 |)........KG.....|\n 00000040 db 1c 01 \
45 95 10 e0 a2 43 fe 8e ac 88 2f e8 75 |...E....C..../.u|\n 00000050 8b 19 5f\
8c e0 8a 80 61 56 3c 68 0f e1 1f 73 9e |.._....aV<h...s.|\n 00000060 61 4f d\
a db 90 ce 84 e3 79 5f 9d 6c a0 90 ff fa |aO......y_.l....|\n 00000070 d8 16 \
e8 76 07 b2 e5 5e 8e 3e a4 45 61 2f 6a 2d |...v...^.>.Ea/j-|\n 00000080 5d 11\
74 94 03 3c 5d |].t..<]|\n}\n\n2016/02/25 03:56:45\
174.142.92.126:8443 - VULNERABLE\n",
"vulns": ["CVE-2014-0160"]
},
"ip_str": "174.142.92.126"
}
배너 값이나 SSL 값을 이용하여 취약점 테스팅도 가능한데, 그러한 예시 중 몇 개를 소개하고자 한다.
Heartbleed
우선 HTTPS 취약점 중 하나인 HeartBleed 취약점도 Shodan 을 활용하여 확인 및 파악이 가능하다.
Heartbleed 에 취약한 경우 배너 내 2개 추가 속성이 포함된다. `opts.heartbleed` 항목에선 Heartbleed 테스트를 실행한 결과의 원시 응답 값이 포함되며, 테스트를 위해 크롤러는 서비스가 Heartbleed 의 영향을 받는지 확인을 위해 약간의 오버플로우가 발생한 값을 가져온다. 또한 크롤러는 해당 장치가 취약한 경우 `opts.vulns` 목록 내 CVE-2014-0160 을 추가하며, 취약하지 않는 경우 `!CVE-2014-0160` 을 추가한다.
ex03. HeartBleed Vulnerability Example
{
"opts": {
"heartbleed": "... 174.142.92.126:8443 - VULNERABLE\n",
"vulns": ["CVE-2014-0160"]
}
}
- Heartbleed 영향을 받는 미국 장치 검색
country:US vuln:CVE-2014-0160
Freak
스캔하려는 서비스가 EXPORT 암호를 지원하는 경우 (FREAK - CVE-2015-0204), 크롤러는 opts.vulns 속성 내 'CVE-2015-0204' 항목을 추가한다.
ex04. FREAK Vulnerability Example
"opts": {
"vulns": ["CVE-2015-0204"]
Logjam
크롤러는 ephemeral Diffie-Hellman 이라는 암호를 사용해서 SSL 서비스로 연결을 시도 (TLS Vulnerablitiy:CVE-2015-4000) 하며 해당 연결에 대해 성공하면 다음과 같은 정보를 저장한다.
ex05. Logjan Vulnerability Example
"dhparams": {
"prime": "bbbc2dcad84674907c43fcf580e9...",
"public_key": "49858e1f32aefe4af39b28f51c...",
"bits": 1024,
"generator": 2,
"fingerprint": "nginx/Hardcoded 1024-bit prime"
}
일반적으로 브라우저가 SSL 서비스 연결 시, 서버와 사용할 SSL 버전 및 암호를 교환한다. 이후 TLSv1.2 등과 같은 특정 SSL 버전 사용에 동의하고 통신 시 사용하게 되는데, Shodan 크롤러는 위 서술대로 서버와 협상하는 일반적인 요청으로 우선 SSL 테스트를 시작하나, 특정 SSL 버전을 사용해 명시적으로 연결을 시도한다.
그러니까 크롤러는 SSLv2, SSLV3, TLSv1.0, TLSv1.1 및 TLSv1.2, TLSv1.3 등을 사용해 서버에 연결을 시도한다 할 수 있으며, SSL 서비스가 지원하는 모든 버전을 결정한다 할 수 있다.
ex06. Version Vulnerability Example
{
"ssl": {
"versions": ["TLSv1", "SSLv3", "-SSLv2", "-TLSv1.1", "-TLSv1.2"]
}
}
버전 앞에 '-' 문자가 서술되어 있는 경우 해당 SSL 버전을 지원하지 않으며 존재하지 않는 경우 지원한다 볼 수 있다.
위 예시06에서 지원하는 SSL 은 TLSv1 과 SSLv3 를 지원한다 볼 수 있다.
- SSLv2 사용 장치 검색
ssl.version:sslv2
Follow SSL Chain
SSL 인증서 체인의 경우 루트에서 최종 사용자까지의 SSL 인증서 목록을 말한다. SSL 서비스의 배너에는 인증서 체인에서의 모든 SSL 인증서를 PEM 직렬화된 인증서로 포함하는 ssl.chain 속성을 포함시킨다.
Data Collect
Shodan 에서 사용되는 크롤러는 24시간 내내 작동하여 데이터베이스를 실시간으로 업데이트하며, 이는 shodan 서비스 페이지에서 데이터를 쿼라하는 순간 해당 정보의 최신 모습을 가져오게 된다.크롤러는 미국 (동부/서부 해안), 중국, 아이슬란드, 프랑스, 대만, 베트남, 루마니아, 체코에 존재하며 지리적 편향 방지를 위해 미국의 시스템 관리자 들이 중국 전체 범위 IP 를 차단하는 등의 방법을 통하여 전 세계에서 데이터를 수집한다.
쇼단 가이드를 이전에 제공받은 시간이 있었으나, 바쁜 생활 중으로 따로 확인/정리를 하지 못해서 이번 기회에 정리를 해보게 되었다. 가이드 문서 내에는 본인이 서술한 내용 뿐만 아니라 웹 인터페이스 사용 방법, Maltego 애드온 사용 방법, 브라우저 플러그인, 개발자 API 등에 소개되어있어 해당 내용을 시간이 나는대로 정리해볼 예정이다.
본 포스팅은 쇼단에 대한 소개와 쇼단 엔진의 구동 알고리즘 및 가져오는 데이터를 요약한 글이므로 참고바란다.