Sploitus

Exploit for blogpost_cve-2018-19987-analysis

kitploit ยท 2026-08-27

Exploit Code

MARKDOWN253 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-NAHUELDSANCHEZ-BLOGPOST_CVE-2018-19987-ANALYSIS
# CVE-2018-19987 (D-Link OS ๋ช…๋ น ์ฃผ์ž…) ๋ถ„์„ ![Twitter URL](https://img.shields.io/twitter/url?style=social&url=https://github.com/nahueldsanchez/blogpost_cve-2018-19987-analysis)

![Twitter Follow](https://img.shields.io/twitter/follow/nahueldsanchez_?color=1DA1F2&logo=twitter&style=for-the-badge)

์•ˆ๋…•ํ•˜์„ธ์š”!

์ด ์งง์€ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์—์„œ๋Š” CVE-2018-19987์˜ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ๋” ์ž˜ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰ํ•œ ๊ฐ„๋‹จํ•œ ๋ถ„์„์„ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ์ด CVE์— ๋Œ€ํ•œ ๊ณต๊ฐœ ์ •๋ณด๋‚˜ ์ต์Šคํ”Œ๋กœ์ž‡์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ด์„œ ์ด CVE๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•œ ์งํ›„, ์—ฌ๊ธฐ์™€ ์—ฌ๊ธฐ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ๋‘ ๊ฐœ์˜ ๊ณต๊ฐœ PoC๋ฅผ GitHub์—์„œ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฏธ ๋Œ€๋ถ€๋ถ„์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ๊ณ  ์™„์ „ํ•œ ๋ถ„์„์„ ์ฐพ์ง€ ๋ชปํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์–ด์จŒ๋“  ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์„ ์ž‘์„ฑํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

์žฌ๋ฏธ์žˆ๊ฒŒ ์ฝ์œผ์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค!

_์—…๋ฐ์ดํŠธ:_ ์Œ.. ์ด ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์„ ์ž‘์„ฑํ•˜๋Š” ๋™์•ˆ ๋ง‰ํ˜€์„œ ๊ตฌ๊ธ€๋ง์„ ํ•˜๋‹ค๊ฐ€ D-Link DIR-818์—์„œ ๋งค์šฐ ์œ ์‚ฌํ•œ ์ทจ์•ฝ์ (CVE-2018-19986)์„ ์„ค๋ช…ํ•˜๋Š” ๋‹ค์Œ ๊ธฐ์‚ฌ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ผ์šฐํ„ฐ ์ทจ์•ฝ์  ๋ถ„์„ ์‹œ๋ฆฌ์ฆˆ (5): CVE-2018-19986 DIR-818LW&828 ๋ช…๋ น ์ฃผ์ž… ์ทจ์•ฝ์  ๋ถ„์„ ๋ฐ ์žฌํ˜„ (Google ๋ฒˆ์—ญ) Ogur1 ์ž‘์„ฑ.

# CVE-2018-19987 ๋ถ„์„

๊ธฐ๊ธฐ์— ๋Œ€ํ•ด ์ˆ˜์ง‘ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ •๋ณด๋ฅผ ๋ชจ์œผ๋ฉด์„œ ๋ถ„์„์„ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค:

  * ์ œํ’ˆ๋ช…: D-Link DIR-822-US
  * ์ œํ’ˆ ํŽ˜์ด์ง€: https://us.dlink.com/en/products/dir-822-d-link-wifi-router-ac1200-dual-band
  * ์ง€์› ํŽ˜์ด์ง€: https://support.dlink.com/ProductInfo.aspx?m=DIR-822-US
  * ๋ชจ๋ธ: DIR-822 ๋ฆฌ๋น„์ „ C (๋‹ค๋ฅธ ๊ธฐ๊ธฐ๋„ ์˜ํ–ฅ์„ ๋ฐ›์Œ)
  * ์˜ํ–ฅ์„ ๋ฐ›๋Š” ํŽŒ์›จ์–ด ๋ฒ„์ „: FW v3.01B02
  * ์˜ํ–ฅ์„ ๋ฐ›๋Š” ํŽŒ์›จ์–ด ํŒŒ์ผ๋ช…: DIR822C1_FW301WWb02.bin (md5sum: 1bff7ec8b4da0643f65b4d44c630e92b)
  * ์ˆ˜์ •๋œ ํŽŒ์›จ์–ด ๋ฒ„์ „: FW v3.13
  * ์ˆ˜์ •๋œ ํŽŒ์›จ์–ด ํŒŒ์ผ๋ช…: DIR822C1_FW313WWb01.bin (md5sum: aa16c7016f67be384e0784e439ce26d2)
  * ํŽŒ์›จ์–ด ์•„์นด์ด๋ธŒ ํŽ˜์ด์ง€: ftp://ftp2.dlink.com/PRODUCTS/DIR-822-US/REVC/



## ๊ทผ๋ณธ ์›์ธ ๋ถ„์„

> _์ฐธ๊ณ : ๋ชจ๋“  ๋ถ„์„์€ ํŽŒ์›จ์–ด v3.01B02๋กœ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค._

Mitre์˜ ํŽ˜์ด์ง€์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ์ด ์ทจ์•ฝ์ ์— ๋Œ€ํ•œ ๊ณต๊ฐœ ์ •๋ณด๋Š” ์‹œ์ž‘ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค:

root@kitploit:~
    
    
    D-Link DIR-822 Rev.B 202KRb06, DIR-822 Rev.C 3.10B06, DIR-860L Rev.B 2.03.B03, DIR-868L Rev.B 2.05B02, DIR-880L Rev.A 1.20B01_01_i3se_BETA, and DIR-890L Rev.A 1.21B02_BETA devices mishandle IsAccessPoint in /HNAP1/SetAccessPointMode. In the SetAccessPointMode.php source code, the IsAccessPoint parameter is saved in the ShellPath script file without any regex checking. After the script file is executed, the command injection occurs. A vulnerable /HNAP1/SetAccessPointMode XML message could have shell metacharacters in the IsAccessPoint element such as the `telnetd` string.
    

๋ถ„์„์„ ์‹œ์ž‘ํ•˜๋ ค๋ฉด ์‚ดํŽด๋ณผ ๋ฌด์–ธ๊ฐ€๊ฐ€ ํ•„์š”ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ผ์šฐํ„ฐ์˜ ํŒŒ์ผ ์‹œ์Šคํ…œ(FS)์„ ์ถ”์ถœํ–ˆ์Šต๋‹ˆ๋‹ค.

root@kitploit:~
    
    
    binwalk -eM DIR822C1_FW301WWb02.bin
    
    DECIMAL       HEXADECIMAL     DESCRIPTION
    --------------------------------------------------------------------------------
    0             0x0             DLOB firmware header, boot partition: "dev=/dev/mtdblock/1"
    10380         0x288C          LZMA compressed data, properties: 0x5D, dictionary size: 8388608 bytes, uncompressed size: 4213444 bytes
    1376372       0x150074        PackImg section delimiter tag, little endian size: 10505216 bytes; big endian size: 5021696 bytes
    1376404       0x150094        Squashfs filesystem, little endian, version 4.0, compression:lzma, size: 5019773 bytes, 2282 inodes, blocksize: 131072 bytes, created: 2016-03-18 09:35:31
    

๋ณด์‹œ๋‹ค์‹œํ”ผ Binwalk๋Š” Linux ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง„ ์ •๋ณด๋ฅผ ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณด๋ฉด ๊ถŒ๊ณ ์—์„œ `/HNAP1` ๊ฒฝ๋กœ๋ฅผ ์–ธ๊ธ‰ํ•˜๊ณ  ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ๋ผ์šฐํ„ฐ๊ฐ€ ์ด๋Ÿฌํ•œ URL์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ธฐ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

### HNAP1 ์š”์ฒญ ์ฒ˜๋ฆฌ

ํ›Œ๋ฅญํ•œ /dev/tty0 ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์—์„œ ์„ค๋ช…ํ•œ ๋ฐ”์™€ ๊ฐ™์ด, ์ด๋Ÿฌํ•œ URL์€ ๊ถ๊ทน์ ์œผ๋กœ `htdocs/cgibin`์— ์œ„์น˜ํ•œ `cgibin`์ด๋ผ๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ €๋Š” ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜์—ˆ๋Š”์ง€ ๋” ์ž˜ ์ดํ•ดํ•˜๊ณ  ์‹ถ์—ˆ๊ณ , ๊ฒฐ๊ตญ HTTP ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜์—ˆ๋Š”์ง€ ์ดํ•ดํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. HTTP ์„œ๋ฒ„๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  `httpd.conf` ํŒŒ์ผ์„ ์ฐพ์•„๋ณด์•˜๊ณ , `/etc/services/` ํด๋” ์•„๋ž˜์—์„œ `HTTP.php`๋ผ๋Š” ํŒŒ์ผ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์—๋Š” ๋ฌด์—‡๋ณด๋‹ค๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํฅ๋ฏธ๋กœ์šด ์ค„์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค:

root@kitploit:~
    
    
    $httpd_conf = "/var/run/httpd.conf";
    fwrite("a",$START, "xmldbc -P /etc/services/HTTP/httpcfg.php > ".$httpd_conf."\n");
    fwrite("a",$START, "event PREFWUPDATE add /etc/scripts/prefwupdate.sh\n");
    fwrite("a",$START, "httpd -f ".$httpd_conf."\n");
    fwrite("a",$START, "event HTTP.UP\n");
    fwrite("a",$START, "exit 0\n");
    

์ด ํŒŒ์ผ์ด ํŠน์ • ์‹œ์ ์— ์‹คํ–‰๋˜์–ด `/var/run/httpd.conf` ํŒŒ์ผ์„ ์ž‘์„ฑํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์›น ์„œ๋ฒ„๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜์—ˆ๋Š”์ง€ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด `/etc/services/HTTP/httpcfg.php` ํŒŒ์ผ์„ ๋ถ„์„ํ–ˆ์Šต๋‹ˆ๋‹ค (๊ด€๋ จ ๋ถ€๋ถ„๋งŒ ํฌํ•จํ–ˆ์Šต๋‹ˆ๋‹ค):

root@kitploit:~
    
    
    	if ($hnap > 0)
    	{
    		echo
    		"		Control".							"\n".
    		"		{".									"\n".
    		"			Alias /HNAP1".					"\n".
    		"			Location /htdocs/HNAP1".		"\n".
    		"			External".						"\n".
    		"			{".								"\n".
    		"				/usr/sbin/hnap { hnap }".	"\n".
    		"			}".								"\n".
    		"			IndexNames { index.hnap }".		"\n".
    		"		}".									"\n";
    	}
    

์ด์ œ ๋ชจ๋“  ์กฐ๊ฐ์ด ๋ชจ์˜€์Šต๋‹ˆ๋‹ค! ์›น ์„œ๋ฒ„๊ฐ€ `/usr/sbin/hnap`์„ ์‚ฌ์šฉํ•˜์—ฌ `/HNAP1`์— ๋Œ€ํ•œ HTTP ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, _/dev/tty0_ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ด๊ฒƒ์ด `htdocs/cgibin` ๋ฐ”์ด๋„ˆ๋ฆฌ์— ๋Œ€ํ•œ ๋งํฌ๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ๋‹จ๊ณ„๋Š” `cgibin` ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์‚ดํŽด๋ณด๊ณ  HNAP ์š”์ฒญ์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์ด๋ฏธ์ง€์—์„œ ๋””์ปดํŒŒ์ผ๋œ `main` ํ•จ์ˆ˜์˜ ์ผ๋ถ€๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „๋‹ฌ๋œ URL ๊ฒฝ๋กœ๋Š” `hnap`์ด ๋ฐœ๊ฒฌ๋˜๊ณ  `hnap_main` ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๊นŒ์ง€ ๋‹ค์–‘ํ•œ ๊ฒฝ๋กœ(์˜ˆ: session.cgi, authentication.cgi, captcha.cgi ๋“ฑ)์™€ ๋น„๊ต๋ฉ๋‹ˆ๋‹ค.

> _์ฐธ๊ณ : main ํ•จ์ˆ˜๋ฅผ ๋ถ„์„ํ•˜๋Š” ๋™์•ˆ hnap ๋ฌธ์ž์—ด์„ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. Ghidra๊ฐ€ ์ดˆ๊ธฐ ๋ถ„์„ ์ค‘์— ์ด๋ฅผ ๋ฌธ์ž์—ด๋กœ ๊ฐ์ง€ํ•˜์ง€ ๋ชปํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค._

๋‹ค์Œ ๋‹จ๊ณ„๋Š” ์ด ํ•จ์ˆ˜๊ฐ€ ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜๊ฐ€ ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ๋” ์ž˜ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ๊ด€๋ จ ๋ถ€๋ถ„์˜ ์ฝ”๋“œ ์Šค๋‹ˆํŽซ๋งŒ ์ œ๊ณตํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ผ๋ถ€ ๊ด€๋ จ ๋ถ€๋ถ„์€ ์˜์‚ฌ ์ฝ”๋“œ๋กœ ์™„์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค โ€” ๋ชฉ์ ์„ ๋ช…ํ™•ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ถ€ ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.

root@kitploit:~
    
    
    ...
    HTTP_SOAPACTION = getenv("HTTP_SOAPACTION");
    REQUEST_METHOD = getenv("REQUEST_METHOD");
    HNAP_AUTH = getenv("HTTP_HNAP_AUTH");
    __haystack = getenv("HTTP_COOKIE");
    pcVar1 = getenv("HTTP_REFERER");
    
    ...
    if (HTTP_SOAPACTION != "") {
    	if  (HTTP_SOAPACTION == GetDeviceSettings) {
    		...
    	} else {
    		// These actions will occur during auth. Process
    		if ("GetCAPTCHAsetting" in HTTP_SOAPACTION) {
    			sess_generate_captcha();
    		} else {
    			if ("Login" in HTTP_SOAPACTION) {
    				perform_login();
    			}
    			// We'll land here once auth.
    			if (HNAP_AUTH != "") {
    				if ("uid=" in HTTP_COOKIE){
    					is_valid_auth = perform_auth_process()
    					if (is_valid_auth) {
    						if("logout" in HTTP_SOAPACTION){
    							perform_logout();
    						// If we are auth. and NOT trying to logout
    						// the code will try to perform the action
    						// we requested
    						} else {
    							// If we arrive here we win
    							// interesting code below
    							goto LAB_004141d4;
    						}
    
    					}
    				}
    			}
    			// If we are not authenticated we can't do anything
    			Return "You need proper authorization to use this resource"
    		}
    	}
    } else {
    	...
    }
    
    LAB_004141d4:
        hnap_action = get_hnap_operation(HTTP_SOAPACTION);
        if (HTTP_SOAPACTION != "") {
        	hnap_action_len = strlen(hnap_action);
    	}
    	snprintf(path_to_hnap_php_file,0x100,"%s/%s.php","/etc/templates/hnap/",hnap_action);
    	if (!check_file_access(path_to_hnap_php_file)){
    		return "HNAP ACTION DOES NOT EXIST (FAIL)"
    	}
    	if (REQUEST_METHOD == "POST") {
    
    		// Here arguments for the PHP are extracted
    		parse_request_and_extract_xml()
        
    		if (hnap_action == "GetFirmwareStatus") {
            	system("sh /etc/events/checkfw.sh > /dev/console");
    		}
    
    		// Here the final arguments for the xmldbc_ephp are crafted
            snprintf(ARGS_FOR_XMLDBC_PHP,0x100,"%s%s.php\nShellPath=%s%s.sh\nPrivateKey=%s\n",
                     "/etc/templates/hnap/", hnap_action, &ShellPath, hnap_action, &PRIVATE_KEY);
    
    		// PHP is executed (in our case SetAccessPointMode.php) and the shell
    		// script is written to ShellPath 
            xmldbc_ephp(0,0,ARGS_FOR_XMLDBC_PHP,stdout);
            snprintf(hnap_action, 0x100, "%s", hnap_action);
           
    	   	// Shell command is built to run the previously written shell file
    		// (File written by the PHP script)
            shell_command = "sh %s%s.sh > /dev/console &";
            }
            snprintf(cmd_to_execute, 0x100, shell_command, &PATH, hnap_action);
    
    		// File is executed containing the command injection
            system(cmd_to_execute);
        }
    ...
    

์ด ํ•จ์ˆ˜์— ๋Œ€ํ•œ ๋ถ„์„์ด ์™„๋ฃŒ๋œ ํ›„, `SetAccessPointMode.php` PHP ํŒŒ์ผ์„ ์‚ดํŽด๋ณด๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค โ€” ๊ฒฐ๊ตญ ๊ฒฐํ•จ์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋˜ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค โ€” ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  ์กฐ๊ฐ์„ ๋งž์ถฐ๋ณด๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค:

root@kitploit:~
    
    
    ...
    $IsAccessPoint	= query("/runtime/hnap/SetAccessPointMode/IsAccessPoint");
    ...
    fwrite("w",$ShellPath, "#!/bin/sh\n");
    fwrite("a",$ShellPath, "echo [$0] $1 ... > /dev/console\n");
    fwrite("a",$ShellPath, "echo IsAccessPoint = ".$IsAccessPoint." > /dev/console\n");
    fwrite("a",$ShellPath, "echo Result = ".$Result."\n");
    ...
    

๋ณด์‹œ๋‹ค์‹œํ”ผ, `hnap_main` ํ•จ์ˆ˜์— ์˜ํ•ด ์ฑ„์›Œ์ง€๋Š” `$ShellPath` ๋ณ€์ˆ˜์™€ ์‚ฌ์šฉ์ž๊ฐ€ ์ œ์–ดํ•˜๊ณ  ์ „์†ก๋œ XML ์š”์ฒญ์— ์ „๋‹ฌ๋˜๋Š” `$IsAccessPoint` ๋ณ€์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด PHP ํŒŒ์ผ์— ์˜ํ•ด ์ž‘์„ฑ๋œ ๋ณ€์ˆ˜์—์„œ OS ๋ช…๋ น ์ฃผ์ž…์ด ์–ด๋–ป๊ฒŒ ์‹คํ–‰๋˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ์ต์Šคํ”Œ๋กœ์ž‡ํ•˜๊ธฐ ์œ„ํ•ด pr0v3rbs๊ฐ€ ๊ฐœ๋ฐœํ•œ ์ „์ฒด PoC๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ํ–ฅ์„ ๋ฐ›๋Š” ๋ฒ„์ „๊ณผ ์ˆ˜์ •๋œ ๋ฒ„์ „์— ๋Œ€ํ•ด์„œ๋Š” ๋‚˜์ค‘์— ์กฐ๊ธˆ ๋” ๋…ผ์˜ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ํ‘œ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด, ํŒจ์น˜์— ์ผ์ข…์˜ ํšŒ๊ท€(regression)๊ฐ€ ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ์ด๋ฏธ ํŒจ์น˜๋˜์—ˆ์–ด์•ผ ํ•  ๋ฒ„์ „์—์„œ ์ด ์ทจ์•ฝ์ ์ด ๋‹ค์‹œ ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

## ๋ถ„์„๋œ ํŽŒ์›จ์–ด ๋ฒ„์ „

ํŽŒ์›จ์–ด| ๋ฒ„์ „| MD5 ํ•ด์‹œ| ์ถœ์‹œ ๋‚ ์งœ| ์ทจ์•ฝ ์—ฌ๋ถ€  
---|---|---|---|---  
DIR822C1_FW315WWb02.bin| 3.15B02 WW| 7121771c3e1706ba76fbf244023efad3| 06/11/2019| ์•„๋‹ˆ์š”  
DIR822C1_FW313WWb01.bin| FW v3.13| aa16c7016f67be384e0784e439ce26d2| 10/07/2019| ์•„๋‹ˆ์š”  
DIR822C1_FW303WWb04_i4sa_middle.bin| FW v3.12B04| c3b9a3f115c02e739690616aba2f2d99| 26/04/2019| ์˜ˆ  
DIR822C1_FW312WWb04.bin| FW v3.12B04| eb11afbd136a5b29cea18141f727bfa8| 26/04/2019| ์˜ˆ (*)  
DIR822C1_FW311WWb01.bin| FW v3.11| 6d7c90eaaae835667faea65c862b3c82| 01/01/2019| ์˜ˆ  
DIR822C1_FW311bWWb01_icjg.bin| 3.11B01_icjg_WW| 75e361e1465604aeda5d5dbcaecca977| 21/12/2018| ์•„๋‹ˆ์š”  
DIR822C1_FW303WWb04_i4sa_middle.bin| FW v3.10B06| c3b9a3f115c02e739690616aba2f2d99| 17/08/2018| ์˜ˆ  
DIR822C1_FW310WWb06.bin| FW v3.10B06| e33db75d0801fddb1c90308982e69fe5| 17/08/2018| ์˜ˆ (*)  
DIR-822_C1_FW302WWb05.bin| FW v3.02| 0dbf840c0ff5d3a5b593d33690e15d82| 14/09/2017| ์˜ˆ  
DIR822C1_FW301WWb02.bin| FW v3.01B02| 1bff7ec8b4da0643f65b4d44c630e92b| 27/04/2016| ์˜ˆ  
  
_(*) ์•”ํ˜ธํ™”๋˜์ง€ ์•Š์€ ํ•ด๋‹น ํŽŒ์›จ์–ด ๋ฒ„์ „์ด ์ทจ์•ฝํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ํŽŒ์›จ์–ด ๋ฒ„์ „๋“ค์€ ํ™•์ธํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค._

์œ„ ํ‘œ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด, ์ทจ์•ฝ์ ์€ ์˜ํ–ฅ์„ ๋ฐ›๋Š” PHP ํŒŒ์ผ `SetAccessPointMode.php`๋ฅผ ์ œ๊ฑฐํ•จ์œผ๋กœ์จ _์ผ๋ถ€_ ํŽŒ์›จ์–ด ๋ฒ„์ „์—์„œ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ํ•จ์ˆ˜์—์„œ ์ˆ˜ํ–‰๋˜๋Š” ๊ฒ€์‚ฌ๊ฐ€ ์‹คํŒจํ•˜๊ณ  ์•„๋ฌด๊ฒƒ๋„ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŽŒ์›จ์–ด ๋ฒ„์ „ `FW v3.131` ๋ฐ `3.15B02 WW`์—์„œ `hnap_function`์„ ๋ถ„์„ํ•˜์—ฌ ์ด๋ฅผ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. `hnap_main`์˜ ์ฝ”๋“œ๋Š” ์ด ๋ฌธ์ œ์™€ ๊ด€๋ จํ•˜์—ฌ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์ง€๋งŒ PHP ํŒŒ์ผ์€ ๋” ์ด์ƒ ์กด์žฌํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋” ํฅ๋ฏธ๋กœ์šด ์ ์€ ์ด ๋ฒ„๊ทธ๊ฐ€ ๋ฒ„์ „ `3.11B01_icjg_WW`์—์„œ ํŒจ์น˜๋œ ํ›„, ์–ด๋–ป๊ฒŒ๋“  ํŽŒ์›จ์–ด ๋ฒ„์ „ `FW v3.11`๋ถ€ํ„ฐ `FW v3.12B04`๊นŒ์ง€ ๋‹ค์‹œ ๋„์ž…๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

# ๊ฒฐ๋ก  ๋ฐ ๋‹ค์Œ ๋‹จ๊ณ„

์ฒซ ๋ฒˆ์งธ ๊ฒฐ๋ก ์œผ๋กœ, ์ด๋Ÿฌํ•œ ๊ธฐ๊ธฐ๋ฅผ ์ง„์ •ํ•œ ๋ณด์•ˆ ์žฅ์น˜๋กœ ์ ˆ๋Œ€ ์‹ ๋ขฐํ•˜์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค โ€” ์—…๋ฐ์ดํŠธ์—์„œ ์ผ์–ด๋‚œ ์ผ์€ ์™œ ๊ทธ๋ ‡๊ฒŒ ํ•ด์„œ๋Š” ์•ˆ ๋˜๋Š”์ง€์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•œ ์˜ˆ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์ˆ˜ํ–‰ํ•œ ๋ถ„์„์„ ๋ฐ”ํƒ•์œผ๋กœ, ์ด ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์— ๋‚˜์—ด๋œ ์ฒซ ๋ฒˆ์งธ PoC๋Š” ์ด ํŠน์ • ๋ฒ„์ „์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ๊ฒฐ๋ก ์„ ๋‚ด๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ทจ์•ฝํ•œ PHP ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๋ ค๋ฉด ์ถฉ์กฑํ•ด์•ผ ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์กฐ๊ฑด์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒฐ๋ก : CVSS ์ ์ˆ˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ทจ์•ฝ์ ์˜ ์‹ฌ๊ฐ๋„๋ฅผ ํŒ๋‹จํ•  ๋•Œ ๋งค์šฐ ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ์ด CVE๊ฐ€ 9.8(CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)๋กœ ํ‰๊ฐ€๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ถ„์„ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ ์–ด๋„ ์ด ๋ฒ„์ „์˜ ๊ฒฝ์šฐ, ๊ณต๊ฒฉ์ž๊ฐ€ ์ด๋ฅผ ์ต์Šคํ”Œ๋กœ์ž‡ํ•˜๋ ค๋ฉด ์ž๊ฒฉ ์ฆ๋ช…์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ๋‹จ๊ณ„๋กœ๋Š” ๋ผ์šฐํ„ฐ ์ž์ฒด์— ์ ‘๊ทผํ•˜์ง€ ์•Š๊ณ ๋„ ์ด ์ทจ์•ฝ์ ์„ ์ต์Šคํ”Œ๋กœ์ž‡ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ด ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์—๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋Š” ์ž‘์—…์„ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์€ ๋‹ค์Œ ๊ฒŒ์‹œ๋ฌผ์˜ ์ฃผ์ œ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค!

์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

## ์ฐธ๊ณ  ์ž๋ฃŒ

  * CVE-2018-19986์— ๋Œ€ํ•œ Ogur1 ๋ถ„์„ ๊ธ€
  * /dev/tty0 D-Link HNAP ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ
  * Pedro Ribeiro์˜ HNAP ๊ถŒ๊ณ 
  * CVE-2018-19987 PoC #0, Mario Ceballos ์ž‘์„ฑ
  * CVE-2018-19987 PoC #1, Mingeun Kim ์ž‘์„ฑ
  * CVE-2018-19987 ์„ธ๋ถ€ ์ •๋ณด ๋งํฌ
  * D-Link ํŽŒ์›จ์–ด ๋ณตํ˜ธํ™”
  * Binwalk
  * pro0v3rbs PoC