Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2023-46012 — LINKSYS AC1900 EA7500v3 IGD UPnP 스택 버퍼 오버플로우 원격 코드 실행 취약점 | Kitploit
도구/GitHubGitHub/dest-3/cve-2023-46012
Embedded Systems SecurityIoT SecurityVulnerability AnalysisExploitationReverse EngineeringFuzzingPenetration TestingHardware SecurityBinary Exploitation
GitHubdest-3/cve-2023-46012

CVE-2023-46012

LINKSYS AC1900 EA7500v3 IGD UPnP 스택 버퍼 오버플로우 원격 코드 실행 취약점

721년 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
저장소 보기

CVE-2023-46012

LINKSYS AC1900 EA7500v3 IGD UPnP 스택 버퍼 오버플로우 원격 코드 실행 취약점

이 취약점으로 인해 네트워크 인접 공격자가 영향을 받는 LINKSYS EA7500 라우터에서 임의 코드를 실행할 수 있습니다. 이 취약점을 악용하기 위해 인증은 필요하지 않습니다.

구체적인 결함은 IGD UPnP 서비스로 전달되는 HTTP 요청 데이터 처리 과정에 존재합니다. 특정 SOAP UPnP Action Request에 포함된 사용자 제공 변수의 내용을 파싱할 때, 프로세스는 고정 길이 스택 버퍼에 복사하기 전에 사용자 제공 데이터의 길이를 제대로 검증하지 않습니다. 공격자는 이 취약점을 악용하여 root 권한으로 코드를 실행할 수 있습니다.

제품/펌웨어: Linksys EA7500 펌웨어 Ver.3.0.1.207964을 포함한 모든 버전 - 이 바이너리를 사용하는 다른 라우터 모델 및 펌웨어 버전도 영향을 받습니다

근본 원인 분석

UPnP IGD 서비스 바이너리는 /usr/sbin/IGD에 있으며 기본적으로 포트 49152에서 실행됩니다. 이 서비스는 XML 본문이 포함된 HTTP 요청으로 호출할 수 있는 여러 함수를 설명하는 IGDdevicedesc.xml UPnP XML 설명 파일을 제공합니다. 그중 하나가 SetDefaultConnectionService 함수입니다. 이 함수는 string 유형의 변수 하나를 필요로 합니다. SetDefaultConnectionService 함수가 호출되어 실행되면, 프로그램은 이 버퍼가 포함된 strncpy 호출을 수행하기 전에 사용자 제공 변수의 길이를 검증하지 않습니다. strncpy 호출의 소스 주소와 복사 크기 변수는 모두 사용자에 의해 제어되며, 복사 크기는 사용자 제공 변수의 길이입니다. 그런 다음 데이터는 184바이트 고정 버퍼에 복사되어 스택 버퍼 오버플로우 취약점이 발생합니다.

코드 흐름

SetDefaultConnectionService 함수는 _set_connection_type으로 레이블이 지정됩니다. 이 함수는 184바이트 버퍼를 초기화한 다음, NULL이 아닌 경우 요청에 포함된 사용자 제공 문자열 변수를 보관하는 버퍼에 대한 포인터를 얻습니다. 이는 PAL_xml_node_GetFirstbyName을 호출한 후 PAL_xml_node_get_value를 호출하여 수행됩니다. 아래 코드를 참조하십시오:

root@kitploit:~
int _set_connection_type(int **param_1)

{
  int iVar1;
  char *var_value;
  size_t var_value_length;
  undefined uVar2;
  undefined1 *puVar3;
  char **ppcVar4;
  undefined4 *puVar5;
  char *pcVar6;
  int *piVar7;
  char acStack_d4 [184]; -----> /* Initializing 184-byte buffer */
  
  memset(acStack_d4,0,0xb4);
  iVar1 = PAL_xml_node_GetFirstbyName((*param_1)[0xf0],"NewConnectionType",0); -----> /* iVar1 now points to the user-supplied value */
  if ((iVar1 != 0) && (var_value = (char *)PAL_xml_node_get_value(), var_value != (char *)0x0)) { -----> /* Ensures the user-supplied value is not empty and obtains a pointer to it */
  ...

인젝션 포인트

같은 함수의 후반부에서 strlen 호출을 수행하여 사용자 제공 문자열의 크기에 정적 오프셋 0x174를 더한 값을 얻습니다. 취약한 조건은 이후의 strncpy 호출에서 트리거되는데, 여기서 대상 인자는 새로 초기화된 184바이트 버퍼의 주소이고, 소스는 사용자 제공 문자열에 대한 포인터이며, 복사 작업의 크기는 strlen 호출로 반환된 사용자 제공 문자열의 크기에 정적 오프셋 0x174를 더한 값입니다. 이로 인해 소스 주소와 크기 변수가 모두 사용자에 의해 제어되고 크기 검증 검사가 수행되지 않으므로 버퍼 오버플로우 취약점이 발생합니다. 아래 코드를 참조하십시오:

root@kitploit:~
int _set_connection_type(int **param_1)

{
 ...

      var_value_length = strlen((char *)(iVar1 + 0x174)); ----> /* iVar1 is a pointer to the user supplied string */
      strncpy(acStack_d4,(char *)(iVar1 + 0x174),var_value_length + 1); ----> /* Vulnerable strncpy call */
 ...

스택에서 함수 반환 주소를 덮어쓰기 위한 오프셋은 276바이트입니다. 다음 4바이트를 사용하여 실행을 임의의 주소로 리디렉션하여 프로그램의 제어 흐름을 가로챌 수 있습니다.

권장 수정 사항

  1. 더 안전한 문자열 복사 함수 사용: 대상 버퍼의 null 종료를 보장하지 않는 strncpy 대신 strncpy_s 또는 memcpy_s와 같은 더 안전한 문자열 복사 함수를 사용할 수 있습니다. 이러한 함수는 대상 버퍼가 항상 null로 종료되도록 보장하며 버퍼가 수용할 수 있는 것보다 더 많은 데이터를 복사하는 것을 허용하지 않습니다.

  2. 입력 검증: 사용자 입력이 대상 버퍼의 크기를 초과하지 않도록 검증합니다. 입력이 버퍼 크기보다 길면 거부하거나 버퍼에 맞게 잘라냅니다.

  3. 동적으로 할당된 버퍼 사용: 고정 크기 스택 버퍼 대신 대상 버퍼용 메모리를 동적으로 할당합니다. 이 접근 방식은 입력 데이터 크기에 따라 버퍼 크기를 조정할 수 있게 합니다. (리소스가 제한된 시스템에는 권장되지 않음)

PoC 실행: python poc.py 192.168.1.1 49152

소프트웨어 다운로드 링크: https://support.linksys.com/kb/article/559-en/ (펌웨어 버전 Ver. 3.0.1.207964)

디버깅 참고 사항

  • 라우터에는 root 셸을 얻는 데 사용할 수 있는 UART 인터페이스가 있습니다. root 액세스 자격 증명은 root:admin입니다.
  • 이 작업 중 사용된 테스트 장치는 EA7500 R75입니다. 이 장치에는 Rx 핀이 비활성화된 UART 인터페이스가 있습니다.
    • Rx 라인을 연결하기 위해 구부러진 종이 클립을 사용하여 Rx 핀을 PCB의 라인에 연결하여 장치에 로그인할 수 있게 했습니다.
  • 박스에서 root 셸을 확보한 후, 정적으로 컴파일된 gdb-server를 넣습니다(여기서 제공되는 사전 빌드 바이너리 gdbserver-7.7.1-armel-eabi5-v1-sysv를 사용했습니다: https://github.com/stayliv3/gdb-static-cross/tree/master/prebuilt).
  • pkill IGD를 사용하여 바이너리를 종료한 다음 ./gdbserver :1337 /usr/sbin/IGD를 사용하여 다시 실행합니다. 다음 .gdbinit 파일을 사용하여 안정적인 디버깅 세션을 시작할 수 있습니다:
root@kitploit:~
> set follow-fork-mode child
> set detach-on-fork off
> target remote 192.168.1.1:1337
> c

추가 링크

  • https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2023-46012
  • https://nvd.nist.gov/vuln/detail/CVE-2023-46012
도구 다운로드