写入NetworkStream以使用Varnish进行身份验证失败

时间:2015-06-15 13:10:15

标签: c# telnet varnish networkstream

我试图从需要身份验证的简单Telnet服务器(Varnish)读取和写入。这是通过挑战短语完成的,我必须提供正确的答案。

我有一个简单的C#测试做类似的事情来获得挑战短语(服务器发送一堆行,其中一行包含挑战):

System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient();
clientSocket.Connect("1.2.3.4", 81);

byte[] inStream = new byte[65536];
NetworkStream serverStream = clientSocket.GetStream();
serverStream.Read(inStream, 0, (int)clientSocket.ReceiveBufferSize);
string returndata = System.Text.Encoding.ASCII.GetString(inStream);
var lines = returndata.Split('\n');
var challenge = lines[1];

我现在遇到了challenge中的挑战。

要生成正确的响应,我必须构建一些文本和SHA256:

var secret = "secretpassword";
var response = string.Format("{0}\n{1}\n{0}\n", challenge, secret);
char[] chars = response.ToCharArray();

var bytes = Encoding.ASCII.GetBytes(response)
var sha = SHA256Managed.Create();
var crypto = sha.ComputeHash(bytes);
var hash = string.Empty;
foreach (byte bit in crypto)
{
    hash += bit.ToString("x2");
}

所有这一切的结尾是一个SHA256字符串。

服务器希望我发送短语“auth”后跟字符串,所以我发送:

var auth = string.Format("auth {0}\n", hash);

byte[] outStream = System.Text.Encoding.ASCII.GetBytes(auth);
serverStream.Write(outStream, 0, outStream.Length);
serverStream.Flush();
returndata = System.Text.Encoding.ASCII.GetString(inStream);

如果我通过尝试通过Telnet自己连接然后将挑战短语注入我的代码来调试这个,我可以将'aut'值复制到我的telnet客户端,它工作正常。它只是从我的代码不起作用,所以我怀疑最后的“写入服务器”部分是错误的。

以下是使用Putty进行工作复制和粘贴的示例。您可以在第2行看到挑战,在第5行,我发送响应。 enter image description here

CLI Authentication: The Gory Details

1 个答案:

答案 0 :(得分:0)

好吧,这对我来说是一个荒谬的错误 - 没有什么比使用Varnish,套接字或任何有价值的东西更聪明。

我完全忘了实际读取auth令牌的响应,所以我只是检查原始'失败'结果的值......

最后一节应该是:

OnCreateView()