Recently worked on interesting case where internal IP address was revealed whenever we try to query through wfetch tool
Request Flow==========Client -> ISA -> IIS 7x.x.x.30 ->x.x.x.10-> x.x.x.20
We have DNS installed on ISA server, having A record entry iistest.com pointing to x.x.x.20First thought was to follow kb 834141 , we ran following command on IIS 7 box (it’s new install)C:\Windows\System32\inetsrv>appcmd.exe set config -section:system.webServer/serverRuntime /alternateHostName:"iistest.com" /commit:apphost
That didn't help . Thought to capture Netmon sniffer trace for :1) Request from wfetch2) Request from IE
Request:GET /exchange/ HTTP/1.0
Response:HTTP/1.1 302 Moved TemporarilyContent-Length: 0
Location: http://X.X.X.20/exchweb/bin/auth/owalogon.asp?url=http://X.X.X.20/exchange/&reason=0&replaceCurrent=1
Set-Cookie: sessionid=; path=/; expires=Thu, 01-Jan-1970 00:00:00 GMTSet-Cookie: cadata=; path=/; expires=Thu, 01-Jan-1970 00:00:00 GMTDate: Tue, 02 Dec 2008 15:49:46 GMTConnection: close
Request:GET /exchange HTTP/1.1Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*Accept-Language: en-usUA-CPU: x86Accept-Encoding: gzip, deflateUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322)Host: iistestConnection: Keep-Alive
Response:HTTP/1.1 302 Moved TemporarilyContent-Length: 0Location: http://iistest/exchweb/bin/auth/owalogon.asp?url=http://iistest/exchange&reason=0&replaceCurrent=1
Set-Cookie: sessionid=; path=/; expires=Thu, 01-Jan-1970 00:00:00 GMTSet-Cookie: cadata=; path=/; expires=Thu, 01-Jan-1970 00:00:00 GMTDate: Tue, 02 Dec 2008 15:51:50 GMT
The difference between two requests is HTTP/1.0 and HTTP/1.1 protocol. What I can make
“HTTP/1.1 requires requests to include a Host header”
HTTP/1.0 assumed that a GET would be sent directly to the correct server (with a relative path). So this relative path is translating into IP.
Bingo!! now we know whenever we get 302 request on HTTP/1.0 , internal IP address is revealedPoints is how to disable HTTP/1.0 requests from server side:
1) You can write your own ISAPI filter/Module to scan incoming headers and reject it if its on HTTP/1.0 protocol2) Or Use URL Rewrite module on IIS 7
I followed the later approach and created rewrite rule in web.config for Default website location (C:\inetpub\wwwroot )
<rewrite> <rules> <rule name="RequestBlockingRule1" patternSyntax="Wildcard" stopProcessing="true"> <match url="*" /> <conditions> <add input="{SERVER_PROTOCOL}" pattern="HTTP/1.0" /> </conditions> <action type="AbortRequest" /> </rule> </rules> </rewrite> </system.webServer>
This rule blocked requests coming on HTTP/1.0 with page cannot be displayed you can modify rule to show error page stating HTTP/1.0 not allowed. :)