YAPC::Russia 2009 Докладчик: Илья Зеленчук, Perlсlub УрГУ (г. Екатеринбург) Perl в хэке и хэки в Perl
Игры CTF (Capture the Flag) ICFP EACP (Extremely Advanced Computer Programming) YAPC::Russia 2009
Perl в хэке Простоя работа с сетью; Удобен при написании PoC; Обфускация кода; Генерация сложночитаемого С кода; Затрудненный reverse. YAPC::Russia 2009
Пример игрового сервиса YAPC::Russia 2009
Простой веб клиент YAPC::Russia 2009 ;
Perl2C... (3474 строки) xpv_list[79].xpv_pv = savepvn("Hello, MayPerl\n", 15); { SV **svp; AV *av = (AV*)&sv_list[279]; av_extend(av, 2); svp = AvARRAY(av); *svp++ = (SV*)&PL_sv_undef; *svp++ = (SV*)&sv_list[280]; AvFILLp(av) = 2; } PL_curpad = AvARRAY((AV*)&sv_list[279]); GvHV(PL_incgv) = (HV*)&sv_list[53];... (150 строк) YAPC::Russia 2009
Perl2bin YAPC::Russia 2009
Хэки в Perl Простой сокет в Perle; Sniffer под UNIX без использования libpcap; Прием/отправка пакетов и использованием raw socket; Неблокирующие сокеты. YAPC::Russia 2009
Perl sockets #!/usr/bin/perl use Socket; socket $S, PF_INET, SOCK_STREAM, getprotobyname('tcp); my $addr=sockaddr_in(80, inet_aton($ip)); connect $S, $addr or die "Can't open connection: $!\n"; send $S, "GET / HTTP/1.0\r\n\r\n", 0; print ; close $S; YAPC::Russia 2009
Sniffer под Unix без использования libpcap #!/usr/bin/perl #use Socket; use constant PF_PACKET => 17; use constant SOCK_PACKET => 10; use constant ETH_P_ALL => 0x0003; socket (SOCKET, PF_PACKET, SOCK_PACKET, ETH_P_ALL) or die Socket error: $!\n"; while (){ recv (SOCKET, $buf, 1514, 0); # читаем пакет print unpack ("H*", $buf), "\n\n"; # выводим его в формате hex } YAPC::Russia 2009
Отправка UDP пакета через raw socket #!/usr/local/bin/perl use Socket; use constant IPPROTO_RAW => 255; $iaddr = inet_aton (' '); $paddr = sockaddr_in (80, $iaddr); #80 - порт назначения socket(SOCKET, PF_INET, SOCK_RAW, IPPROTO_RAW) or die Socket error: $!\n"; … YAPC::Russia 2009
Отправка UDP пакета через raw socket $packet.= pack("C", 69); $packet.= pack ("H2", '00'); $packet.= pack ("n", 28); $packet.= pack ("n", 0); $packet.= pack ("H4", '4000'); $packet.= pack ("C", 64); $packet.= pack ("C", getprotobyname('udp')); $packet.= pack ("n", 0); $source_ip = ' '; $result_source_ip.= pack ("C", $_) for (split('\.', $source_ip)); $packet.= $result_source_ip; $destination_ip = ' '; $result_destination_ip.= pack ("C", $_) for (split('\.', $destination_ip)); $packet.= $result_destination_ip; $packet.= pack ("n", 25); $packet.= pack ("n", 80); $packet.= pack ("n", 8); $packet.= pack ("H4", '0000'); YAPC::Russia 2009
Отправка пакетов через packet socket С какого интерфейса происходит отправка пакета: struct sockaddr { sa_family_t sa_family; //семейство протоколов char sa_data[14]; //14 байтов на описание этого семейства... }; YAPC::Russia 2009
Отправка пакетов через packet socket Пример заполнения структуры и отправки пакета: $addr = PF_PACKET; #семейство $iface = "eth0"; #используемое устройство $socket = pack ('Sa14', $addr, $iface); #упаковываем все это в структуру send(SOCKET, $packet, 0, $socket) or die "Can't send packet:$!\n"; YAPC::Russia 2009
Неблокирующий сокет на Perl (Windows) … my ($win, $ein); my $addr=sockaddr_in(86, inet_aton(" ")); socket SOCK, PF_INET, SOCK_STREAM, 0 or die "Socket: $!\n"; ioctl(SOCK, 0x e, pack("I", 1)); connect SOCK, $addr; vec ($win = '',fileno(SOCK),1)=1; $ein=$win; my $nfound = select (undef, $win, $ein, 1); … YAPC::Russia 2009
Perl в хэке и хэки в Perl СПАСИБО ЗА ВНИМАНИЕ! Илья Зеленчук YAPC::Russia 2009
Запустить netcat, повесить bash, catнуть файл, grepнуть по регвыру... Или лучше установить Perl? Или лучше установить Perl? K.I.S.S. YAPC::Russia 2009