=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-[09]-=[Daemon Fingerprint]=-|Inferninho|=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
--=[ Introducao
Sempre que iniciamos um ataque se faz necessario um estudo sobre o alvo,
determinando assim brechas em potencial, isso inclui sabermos as versoes dos da-
emons que estao rodando no servidor, este texto ira demonstrar alguns metodos de
deteccao destes daemons, assim como estudo sobre os metodos utilizados por algu-
mas ferramentas disponiveis na internet.
--=[ Banner Grabbing
Todos os daemons exibem um banner de boas vindas quando recebem uma co-
nexao, na verdade nao passa de pura e simplesmente propaganda do produto, e'
trivial visualizarmos esse banner, um simples telnet faz isso. Supondo que um
atacante queira descobrir qual o daemon de ftp esta rodando numa maquina alvo,
ele se conecta na porta correspondente ao ftp e aguarda a exibicao do banner.
inferninho@weapon:~$ telnet localhost 21
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 ProFTPD 1.2.9 Server (weapon) [weapon.first.weapon.org]
quit
221 Goodbye.
Connection closed by foreign host.
Como podemos notar se trata de um ProFTPD 1.2.9. Todos os daemons que
permitem interagir com o usuario via telnet estao sujeitos a esse tipo de detec-
cao, agora vamos ver um esquema que visa puxar o banner do httpd.
inferninho@weapon:~$ telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
get index.html HTTP/1.0
HTTP/1.1 400 Bad Request
Date: Fri, 10 Dec 2004 19:50:59 GMT
Server: Apache/1.3.31 (Unix) PHP/4.3.7
Connection: close
Content-Type: text/html; charset=iso-8859-1
400 Bad Request
Bad Request
Your browser sent a request that this server could not understand.
The request line contained invalid characters following the protocol string.
Apache/1.3.31 Server at weapon.first.weapon.org Port 80
Connection closed by foreign host.
Nesse caso simplesmente enviamos um get index.html HTTP/1.0 e foi retor-
nado na linha denominada "Server:" a versao do daemon httpd Apache/1.3.31 (Unix)
PHP/4.37 alem de podermos notar que o servidor esta rodando num sistema unix e
com suporte a PHP.
Podemos automatizar todo o processo atraves do uso de ferramentas.
- NMAP que pode ser encontrado em http://www.insecure.org/nmap
- AMAP da THC http://www.thc.org
- TMAP
inferninho@weapon:~$ cat tmap.pl
<++> tmap.pl
#!usr/bin/perl
# TMAP (Tosco MAP?)-> Realiza Banner Grabbing
# coded by Inferninho
###
use IO::Socket;
$ARGC=@ARGV;
if($ARGC<2) {
print "Usage: perl $0 host porta\n\n";
exit;
}
my ($HOST)=$ARGV[0];
my ($PORT)=$ARGV[1];
my (@res,@ref);
my $res;
my $pagina="/index.html";
my $socket = IO::Socket::INET->new(
PeerAddr => "$HOST",
PeerPort => "$PORT",
Prot => "tcp"
);
die "Nao foi possivel criar a socket\n" unless $socket;
if ($PORT eq "80")
{
&http
}
elsif ($PORT eq "8080")
{
&http
}
else {
&outros
}
sub http {
if ($socket) {
print $socket "GET $pagina HTTP/1.0\n\n" or die "erro";
}
@res=<$socket>;
@ref=grep/Server/,@res;
print "\nDaemon em $HOST porta $PORT:\n\n";
print "@ref\n";
close ($socket);
exit;
}
sub outros {
if ($socket) {
print $socket "quit\n" or die "erro";
}
$res=<$socket>;
print "\nDaemon em $HOST porta $PORT:\n\n";
print "$res\n";
close ($socket);
exit;
}
<--> tmap.pl
--=[ Deteccao de Banners Alterados
Algumas vezes o banner pode ter sido alterado, ocorrendo o que se co-
nhece como seguranca por obscuridade, vemos um exemplo muito claro disso logo
abaixo.
inferninho@weapon:~$ telnet localhost 21
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 Specter-FTPd 2.1
quit
221 Goodbye.
Connection closed by foreign host.
Nao conheco nenhum daemon de ftp chamado Specter-FTPd, fica evidente que
esse banner foi alterado, a tecnica de banner grabbing vai por agua abaixo nesse
caso, mas se comecarmos a comparar alguns daemons veremos que cada um possui al-
gumas caracteristicas peculiares, isso mesmo, ja que o daemon nos permite inte-
ragir com ele, vamos abusar desse recurso, vamos analisar dois daemons diferen-
tes de ftp agora.
inferninho@weapon:~$ telnet localhost 21
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 ProFTPD 1.2.9 Server (weapon) [weapon.first.weapon.org]
help
214-The following commands are recognized (* =>'s unimplemented).
USER PASS ACCT* CWD XCWD CDUP XCUP SMNT*
QUIT REIN* PORT PASV EPRT EPSV TYPE STRU
MODE RETR STOR STOU APPE ALLO* REST RNFR
RNTO ABOR DELE MDTM RMD XRMD MKD XMKD
PWD XPWD SIZE LIST NLST SITE SYST STAT
HELP NOOP FEAT OPTS ADAT* AUTH* CCC* CONF*
ENC* MIC* PBSZ* PROT*
214 Direct comments to root@localhost.
quit
221 Goodbye.
Connection closed by foreign host.
Ao conectarmos rebemos logo de cara a versao do servidor de ftp, trata-
se de um ProFTPD 1.2.9, em seguida enviamos um help para vizualizacao do menu de
ajuda edepois um quit. Abaixo outro exemplo agora num Pure-FTPd.
inferninho@weapon:~$ telnet localhost 21
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220---------- Welcome to Pure-FTPd [TLS] ----------
220-You are user number 3 of 50 allowed.
220-Local time is now 16:19. Server port: 21.
220-This is a private system - No anonymous login
220 You will be disconnected after 15 minutes of inactivity.
help
214-The following SITE commands are recognized
ALIAS
CHMOD
IDLE
214 Pure-FTPd - http://pureftpd.org/
quit
221-Goodbye. You uploaded 0 and downloaded 0 kbytes.
221 Logout.
Connection closed by foreign host.
Se observamos o menu de ajuda e a mensagem de saida dos dois daemons
iremos notar algumas diferencas, comparem como os daemons reagem apos recebe-
rem os comandos "help" e "quit". Agora se fizermos o mesmo com o nosso Specter-
FTPd, teremos:
inferninho@weapon:~$ telnet localhost 21
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 Specter-FTPd
help
214-The following commands are recognized (* =>'s unimplemented).
USER PASS ACCT* CWD XCWD CDUP XCUP SMNT*
QUIT REIN* PORT PASV EPRT EPSV TYPE STRU
MODE RETR STOR STOU APPE ALLO* REST RNFR
RNTO ABOR DELE MDTM RMD XRMD MKD XMKD
PWD XPWD SIZE LIST NLST SITE SYST STAT
HELP NOOP FEAT OPTS ADAT* AUTH* CCC* CONF*
ENC* MIC* PBSZ* PROT*
214 Direct comments to root@localhost.
quit
221 Goodbye.
Connection closed by foreign host.
Muito bem, se tivermos que dar um "palpite" ao compararmos a saida do
Specter-FTPd com a do ProFTPD e Pure-FTPd, fica realmente obvio que o daemon com
banner alterado e um ProFTPD. Alguns podem estar se perguntando, algo como: Mas
todos daemons tem saida diferentes? A resposta e' sim, podemos notar diferencas
mesmo num mesmo daemon em versoes diferentes. Para ficar mais visivel ainda vou
colocar duas saidas referentes ao Exim e ao Sendmail.
inferninho@weapon:~$ telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220-linux.meudns.org ESMTP Exim 4.43 #1 Fri, 10 Dec 2004 18:23:53 -0200
220-We do not authorize the use of this system to transport unsolicited,
220 and/or bulk e-mail.
help
214-Commands supported:
214 AUTH STARTTLS HELO EHLO MAIL RCPT DATA NOOP QUIT RSET HELP
quit
221 weapon.fisrt.weapon.org closing connection
Connection closed by foreign host.
inferninho@weapon:~$ telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 weapon.first.weapon.org ESMTP Sendmail 8.12.11/8.12.11; Fri, 10 Dec 2004 20:46:10 GMT
help
214-2.0.0 This is sendmail version 8.12.11
214-2.0.0 Topics:
214-2.0.0 HELO EHLO MAIL RCPT DATA
214-2.0.0 RSET NOOP QUIT HELP VRFY
214-2.0.0 EXPN VERB ETRN DSN AUTH
214-2.0.0 STARTTLS
214-2.0.0 For more info use "HELP ".
214-2.0.0 To report bugs in the implementation send email to
214-2.0.0 sendmail-bugs@sendmail.org.
214-2.0.0 For local information send email to Postmaster at your site.
214 2.0.0 End of HELP info
quit
221 2.0.0 weapon.first.weapon.org closing connection
Connection closed by foreign host.
Nesse caso a diferenca eh realmente gritante, mesmo que os banner fossem
alterados, o menu de ajuda e mensagem de saida continuam inalterados e nos per-
mite identificar o daemon por meio de comparacoes.
--=[ Estudo de Caso - NMAP X AMAP X TMAP
Na verdade vou centralizar esse topico no nmap uma vez que este e' mais
completo que o amap e o tmap, os dois ultimos sao facilmente ludibriados e ainda
precisam de algumas implementacoes.
inferninho@weapon:~$ perl tmap.pl localhost 21
Daemon em localhost porta 21:
220 Specter-FTPd
inferninho@weapon:~$ amap localhost -B 21
amap v4.7 (www.thc.org) started at 2004-12-10 21:20:40 - BANNER GRAB mode
Banner on 127.0.0.1:21/tcp : 220 Specter-FTPd\r\n
amap v4.7 finished at 2004-12-10 21:20:40
Como podemos ver os dois engolem facilmente o Specter-FTPd e o imprime
na tela como uma informacao correta. Isso ocorre por que os dois apenas lancam
na tela a primeira informacao que recebem, sem averiguar sua veracidade.
Apesar do amap ter outras funcoes alem do banner grabbing o tmap e'
mais completo nesse quesito, isso se levarmos em conta que o amap sequer tem
implementacao para detectar daemons de httpd.
inferninho@weapon:~$ amap localhost -B 80
amap v4.7 (www.thc.org) started at 2004-12-10 21:27:32 - BANNER GRAB mode
amap v4.7 finished at 2004-12-10 21:27:38
A saida dele fica em branco, ja no tmap:
inferninho@weapon:~$ perl tmap.pl localhost 80
Daemon em localhost porta 80:
Server: Apache/1.3.31 (Unix) PHP/4.3.7
Apache/1.3.31 Server at weapon.first.weapon.org Port 80
O nmap faz uma implementacao diferente, ao receber o banner ele confere
com um banco de dados (/usr/share/nmap/nmap-service-probes) caso a comparacao
seja verdadeira ele imprime a versao do daemon como verdadeira, caso a compa-
racao nao confira com nenhuma das assinaturas de banners contidas no banco de
dados, ele faz outra implementacao simplesmente enviando um comando "help".
Podemos observar isso vendo a saida do tcpdump.
Saida do tcpdump caso a primeira comparacao seja verdadeira.
root@weapon:/home/inferninho# tcpdump
tcpdump: WARNING: Promiscuous mode not supported on the "any" device
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 96 bytes
22:13:46.583168 IP localhost > localhost: icmp 8: echo request seq 63418
22:13:46.583213 IP localhost > localhost: icmp 8: echo reply seq 63418
[......]
Varias Linhas
[......]
22:13:51.148052 IP localhost.ftp > localhost.35437: S 1378107143:1378107143(0)
ack 3500700108 win 32767
22:13:51.148061 IP localhost.35437 > localhost.ftp: R 3500700108:3500700108(0)
win 0
53 packets captured
106 packets received by filter
0 packets dropped by kernel
--------
Saida do tcpdump caso a primeira comparacao seja falsa.
root@weapon:/home/inferninho# tcpdump
tcpdump: WARNING: Promiscuous mode not supported on the "any" device
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 96 bytes
22:08:21.238284 IP localhost > localhost: icmp 8: echo request seq 58344
22:08:21.238334 IP localhost > localhost: icmp 8: echo reply seq 58344
22:08:21.238697 IP localhost.41564 > localhost.http: . ack 2017081566 win 2048
22:08:21.238735 IP localhost.http > localhost.41564: R 2017081566:2017081566(0)
win 0
[......]
Varias Linhas
[......]
22:08:40.768255 IP localhost.41545 > localhost.ftp: R 3825271309:3825271309(0)
win 0
22:08:40.888108 IP localhost.41546 > localhost.ftp: S 3825271309:3825271309(0)
win 2048
22:08:40.888170 IP localhost.ftp > localhost.41546: S 1063640235:1063640235(0)
ack 3825271310 win 32767
22:08:40.888191 IP localhost.41546 > localhost.ftp: R 3825271310:3825271310(0)
win 0
72 packets captured
144 packets received by filter
0 packets dropped by kernel
A diferenca na quantidade de envio de pacotes fica exposta nesse momen-
to, assim podemos afirmar que o nmap age diferente dependendo do caso. Ao con-
trario do que se afirma por ai ele nao faz nenhuma comparacao por meio de res-
postas de pacotes para descobrir a versao do daemon, vamos ter mais provas disso
logo a seguir. Ah, esse icmp 8: echo request na saida do tcpdump e para o os-
fingerprint mas ai eh outra historia.
root@weapon:/home/inferninho# nmap -A localhost -p 21
Starting nmap 3.50 ( http://www.insecure.org/nmap/ ) at 2004-12-10 21:41 UTC
Warning: OS detection will be MUCH less reliable because we did not find at
least 1 open and 1 closed TCP port
Interesting ports on localhost (127.0.0.1):
PORT STATE SERVICE VERSION
21/tcp open ftp
1 service unrecognized despite returning data. If you know the service/version,
please submit the following fingerprint at http://www.insecure.org/cgi-bin/serv
icefp-submit.cgi :
SF-Port21-TCP:V=3.50%D=12/10%Time=41BA1818%P=i486-slackware-linux-gnu%r(NU
SF:LL,12,"220\x20Specter-FTPd\r\n")%r(GenericLines,12,"220\x20Specter-FTPd
SF:\r\n")%r(Help,232,"220\x20Specter-FTPd\r\n214-The\x20following\x20comma
SF:nds\x20are\x20recognized\x20\(\*\x20=>'s\x20unimplemented\)\.\r\n\x20US
SF:ER\x20\x20\x20\x20PASS\x20\x20\x20\x20ACCT\*\x20\x20\x20CWD\x20\x20\x20
SF:\x20\x20XCWD\x20\x20\x20\x20CDUP\x20\x20\x20\x20XCUP\x20\x20\x20\x20SMN
SF:T\*\x20\x20\x20\r\n\x20QUIT\x20\x20\x20\x20REIN\*\x20\x20\x20PORT\x20\x
SF:20\x20\x20PASV\x20\x20\x20\x20EPRT\x20\x20\x20\x20EPSV\x20\x20\x20\x20T
SF:YPE\x20\x20\x20\x20STRU\x20\x20\x20\x20\r\n\x20MODE\x20\x20\x20\x20RETR
SF:\x20\x20\x20\x20STOR\x20\x20\x20\x20STOU\x20\x20\x20\x20APPE\x20\x20\x2
SF:0\x20ALLO\*\x20\x20\x20REST\x20\x20\x20\x20RNFR\x20\x20\x20\x20\r\n\x20
SF:RNTO\x20\x20\x20\x20ABOR\x20\x20\x20\x20DELE\x20\x20\x20\x20MDTM\x20\x2
SF:0\x20\x20RMD\x20\x20\x20\x20\x20XRMD\x20\x20\x20\x20MKD\x20\x20\x20\x20
SF:\x20XMKD\x20\x20\x20\x20\r\n\x20PWD\x20\x20\x20\x20\x20XPWD\x20\x20\x20
SF:\x20SIZE\x20\x20\x20\x20LIST\x20\x20\x20\x20NLST\x20\x20\x20\x20SITE\x2
SF:0\x20\x20\x20SYST\x20\x20\x20\x20STAT\x20\x20\x20\x20\r\n\x20HELP\x20\x
SF:20\x20\x20NOOP\x20\x20\x20\x20FEAT\x20\x20\x20\x20OPTS\x20\x20\x20\x20A
SF:DAT\*\x20\x20\x20AUTH\*\x20\x20\x20CCC\*\x20\x20\x20\x20CONF\*\x20\x20\
SF:x20\r\n\x20ENC\*\x20\x20\x20\x20MIC\*\x20\x20\x20\x20PBSZ\*\x20\x20\x20
SF:PROT\*\x20\x20\x20\r\n214\x20Direct\x20comments\x20to\x20root@localhost
SF:\.\r\n");
Device type: general purpose
Running: Linux 2.4.X|2.5.X
OS details: Linux Kernel 2.4.0 - 2.5.20
Uptime 0.134 days (since Fri Dec 10 18:29:19 2004)
Nmap run completed -- 1 IP address (1 host up) scanned in 20.050 seconds
O nmap confere o banco de dados como nao acha nenhuma saida do Spect-
er-FTPd, ele tenta comparar o help e acusaria um ProFTPD 1.2.9, mas o banco de
assinatura dele esta incorreto ai a informacao nao bate e ele imprime na tela a
saida do help, como podemos conferir observando os trechos em detaque, e pede
para enviarmos para o site da insecure.org, provavelmente para implementacoes
futuras.
Se realmente ele verificasse a respostas de pacotes ao inves do banner
e do menu de help, ele pediria para enviar tal pacote e nao o help do daemon.
Uma vez que o nmap nao faz essa segunda verificacao todas as vezes, fazendo
apenas quando a primeira falha, podemos ludibria-lo colocando um banner valido
de outro daemon:
se mudarmos o ServerIdent do /etc/proftpd.conf para:
ServerIdent on "---------- Welcome to Pure-FTPd [TLS] ----------"
Olha o que ocorre com o nmap:
root@weapon:# nmap -A localhost -p 21
Interesting ports on localhost (127.0.0.1):
PORT STATE SERVICE VERSION
21/tcp open ftp PureFTPd
Caso ele enviasse algum pacote e comparasse a resposta como no caso do
os-fingerprint com certeza ele nao faria tal afirmacao erronea. O banco de dados
com a lista de assinaturas dos daemons encontra-se em: /usr/share/nmap/nmap-se
rvice-probes
--=[ Conclusao
Agora que voce ja sabe como descobrir o que de fato roda naquela porta,
faco eu algumas recomendacoes, mesmo que o nmap seja fodao, quer dizer, nem tan-
to, evite o uso deles em redes com IDS, a nao ser que voce saiba usar as opcoes
corretas dele para fazer um slow scan e mais alguns truques, pois ate o Tabaja-
raIDS consegue logar nmap com as regras mais simples. A melhor forma para ma-
pear a rede sem ser percebido e ir fazendo tudo manualmente, conectando apenas
em portas que realmente rodem algo, se der telnet na porta 1 por exemplo, e mui-
to provavel que voce fique logado, entao escolha bem as portas fazendo conexoes
legitimas, e de um intervalo em cada tentativa, va tomar um cafe, conversar com
a namorada, e volte, nunca se afobe mais que o necessario.
_EOF_