惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Cyberwarzone
Cyberwarzone
V
Vulnerabilities – Threatpost
T
Tenable Blog
Forbes - Security
Forbes - Security
Simon Willison's Weblog
Simon Willison's Weblog
AWS News Blog
AWS News Blog
G
GRAHAM CLULEY
Know Your Adversary
Know Your Adversary
S
Securelist
C
Cybersecurity and Infrastructure Security Agency CISA
Project Zero
Project Zero
C
CXSECURITY Database RSS Feed - CXSecurity.com
V
Visual Studio Blog
WordPress大学
WordPress大学
Latest news
Latest news
K
Kaspersky official blog
T
Tailwind CSS Blog
T
Threat Research - Cisco Blogs
B
Blog RSS Feed
C
Cisco Blogs
博客园 - 聂微东
Martin Fowler
Martin Fowler
T
The Blog of Author Tim Ferriss
小众软件
小众软件
L
LangChain Blog
阮一峰的网络日志
阮一峰的网络日志
L
LINUX DO - 热门话题
Stack Overflow Blog
Stack Overflow Blog
罗磊的独立博客
P
Proofpoint News Feed
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
P
Privacy International News Feed
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
C
CERT Recently Published Vulnerability Notes
Cisco Talos Blog
Cisco Talos Blog
S
SegmentFault 最新的问题
Security Latest
Security Latest
Y
Y Combinator Blog
爱范儿
爱范儿
aimingoo的专栏
aimingoo的专栏
P
Privacy & Cybersecurity Law Blog
L
LINUX DO - 最新话题
月光博客
月光博客
The GitHub Blog
The GitHub Blog
博客园 - 三生石上(FineUI控件)
S
Security Affairs
P
Proofpoint News Feed
D
DataBreaches.Net
有赞技术团队
有赞技术团队
云风的 BLOG
云风的 BLOG

博客园 - Mossan

UltraVNC 简体中文版 1.3.6(Win7以上系统) UltraVNC 简体中文版 1.2.4(WinXP最终版) 数据比较1.0(文本格式) 二代身份Zheng复印(手机正反面拍照生成1:1复印件图像) ownCloud安卓android客户端版本2.11.0 旧手机作为USB无线网卡使用(分享WIFI、蓝牙连接) 计算机开关损坏无法正常启动维修 限时授权复制文件 1.0(2015.9.2更新) Mysql自动备份工具1.0(2013年11月15日更新) Microsoft .NET Framework 3.5 Service Pack 1(完整软件包) 汶川地震感悟 C#模拟键盘登录网站 UltraBackup 1.5.1(2025-01-15更新) LanContain 1.2.2.3(2025-1-15更新) 用C#实现将HTML文件转换为CHM文件(转) 微软推在线版Office可储存1000个Word文档 Fckeditor XML Request error:internal server error (500) 一例 网络管理员升级版LanContain(Web)源代码 蚂蚁
利用c#开发一个telnet unix服务器或者防火墙的小工具(转)
Mossan · 2008-03-07 · via 博客园 - Mossan

因为工作原因,需要定期从AIX服务器和cisco防火墙统计一些信息,于是决定自己写个小程序利用telnet协议实现这个功能。
利用SOCKET建立与服务器之间的连接,之后我们就可以利用程序直接发送命令,获得系统性能状况和防火墙流量,然后就可以保存成文件,只需要查看我们的日志文件就可以知道这些数值了。
在此只描述通过程序telnet AIX服务器的过程,telnet防火墙的过程略过,两者相似,介绍telnet 服务器的过程是因为这里有一些值得我们注意的地方。
首先我们先与服务器23端口建立一个SOCKET连接:

            IPAddress ipaddr = IPAddress.Parse(firewalladdress);
            IPEndPoint ipep = new IPEndPoint(ipaddr, int.Parse(firewallport));           
            Socket mysocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            mysocket.Connect(ipep);

接下来这里有一个问题困扰我很久,最后通过查阅telnet协议才解决,这就是我们在和服务器建立连接之后,服务器会发给我们一堆乱码。因为我们打开cmd窗口,敲入telnet ip port之后,服务器都是直接要求我们输入用户名,然后是密码,所以在此我直接把用户名root发送给服务器,没想到服务器回给我的还是乱码,在查看telnet协议之后,我明白了原来服务器回发给我们的乱码是一些有用的信息,它是在询问我们使用的终端类型,所以我们在建立SOCKET连接之后,应该给服务器发送这样一个包:(如果你也使用的AIX服务器)

            char[] sendfirst = new char[3];
            sendfirst[0] = (char)(255);
            sendfirst[1] = (char)(252);
            sendfirst[2] = (char)(24);
            byte[] sendfirstbytetemp = Encoding.Unicode.GetBytes(sendfirst);
            byte[] sendfirstbyte = new byte[sendfirstbytetemp.Length / 2];
            sendfirstbyte[0] = sendfirstbytetemp[0];
            sendfirstbyte[1] = sendfirstbytetemp[2];
            sendfirstbyte[2] = sendfirstbytetemp[4];
            mysocket.Send(sendfirstbyte, 0, sendfirstbyte.Length, SocketFlags.None);
注意这里为了获得我需要的字节数组,我构建了两个byte数组,可能如果改变编码方式可以直接得到,但是我没找到用哪种编码方式可以直接得到我想要的字节数组,不管了,先实现了领导叫做的功能再说!!

在我们把这个字节数组发送给服务器之后,我们就可以接收服务器回给我们的正确的欢迎信息了,就好像我们在cmd窗口看到的那种提示信息,并提示我们输入用户名。此时我们可以把用户名发给服务器:

            byte[] sendusernametemp = Encoding.ASCII.GetBytes(username);
            byte[] sendusername = new byte[sendusernametemp.Length + 2];
            char[] closechar = new char[2];
            closechar[0] = (char)(10);
            closechar[1] = (char)(13);
            byte[] closebyte = Encoding.ASCII.GetBytes(closechar);
            for (int i = 0; i < sendusernametemp.Length; i++)
            {
                sendusername[i] = sendusernametemp[i];
            }
            sendusername[sendusername.Length - 2] = closebyte[0];
            sendusername[sendusername.Length - 1] = closebyte[1];
            mysocket.Send(sendusername, 0, sendusername.Length, SocketFlags.None);

注意这里我构建了一个char[] closechar ,这里10,13是我们发送信息的结束标志,之前我没有发送这个标志,直接发送用户名给服务器,而后接收服务器给我的包,收到的信息解码之后竟然就是我发送的用户名,最初以为是我发送信息的编码格式有问题,在这里也走了弯路,查看telnet协议明白了我们需要在发送信息结束之后发给服务器10,13作为结束标志,服务器返回的用户名其实只是我们输入数据的回显。如果大家想要深入了解telnet编程,还是建议大家先了解一些telnet协议,很有帮助。

好了,继续我们的编程,我们发送完用户名之后,就可以再次接收服务器给我们的信息。

            byte[] recvdatauser = new byte[255];
            mysocket.Receive(recvdatauser, 0, mysocket.Available, SocketFlags.None);
            string recvuserstr = Encoding.ASCII.GetString(recvdatauser);
            recvuserstr = recvuserstr.Substring(username.Length, recvuserstr.Length - username.Length);//没什么用处,我只是去掉了服务器回显的用户名
            recvuserstr = recvuserstr.Trim();
            Console.WriteLine(recvuserstr);

这时我们接收到的是root's Password:服务器提示我们输入密码,按照上面的例子发送密码给服务器,就可以接收到服务器提示你输入命令的命令提示符了。

转自:http://www.cnitblog.com/feiyang0721/archive/2008/02/29/31875.html