Sekitar sebulan yang lalu saya mengidentifikasi empat kerentanan di suite Aircrack-ng. Sebuah deskripsi singkat tapi teknis dapat ditemukan di bawah ini. Selanjutnya, referensi pada bukti konsep memanfaatkan kode dan penasehat OSI mungkin ditemukan di akhir artikel ini.
- CVE-2014-8322
Salah satunya bisa menyebabkan eksekusi kode jauh. Khususnya dalam fungsi tcp_test aireplay berbunyi struktur nh * dari remote user yang berisi field panjang. Panjang field ditetapkan sebagai argumen len pada recv berikutnya menuju tumpukan meluap.
Kode vulnerable:
struct net_hdr {
uint8_t nh_type;
uint32_t nh_len;
uint8_t nh_data[0];
};
int tcp_test(const char* ip_str, const short port)
{
unsigned char packet[1024];
......
caplen = read(sock, &nh, sizeof(nh));
......
len = ntohl(nh.nh_len);
......
caplen = read(sock, packet, len);
......
}
Sebagai bukti dari konsep, saya menulis sebuah exploit (1) untuk kerentanan ini untuk kali linux diuji pada 1.0.9 dengan paket 1,2 beta3-0kali0 dan untuk kali 1.0.9a dengan paket 1,2-beta3-0kali2. Proteksi cookie Stack telah ditambahkan dalam 1,2-beta3-0kali3.
Kode vulnerable:
struct net_hdr {
uint8_t nh_type;
uint32_t nh_len;
uint8_t nh_data[0];
};
int tcp_test(const char* ip_str, const short port)
{
unsigned char packet[1024];
......
caplen = read(sock, &nh, sizeof(nh));
......
len = ntohl(nh.nh_len);
......
caplen = read(sock, packet, len);
......
}
Sebagai bukti dari konsep, saya menulis sebuah exploit (1) untuk kerentanan ini untuk kali linux diuji pada 1.0.9 dengan paket 1,2 beta3-0kali0 dan untuk kali 1.0.9a dengan paket 1,2-beta3-0kali2. Proteksi cookie Stack telah ditambahkan dalam 1,2-beta3-0kali3.
- CVE-2014-8321
Kerentanan lain adalah eksekusi kode dan eskalasi hak istimewa lokal dalam fungsi gps_tracker airodump itu. Airodump menghubungkan untuk localhost pada port 2947 dan membaca data gps dan membaca lagi dengan garis argumen penyangga ditambah panjang data sebelumnya.
Kode vulnerable:
void gps_tracker( void )
{
int pos;
char line[256];
......
recv(gpsd_sock, line, sizeof( line ) - 1, 0);
......
pos = strlen(line);
......
while (G.do_exit == 0) {
read(gpsd_sock, line+pos, sizeof(line)-1, 0);
}
}
- CVE-2014-8324
Kerentanan ini dapat juga digunakan sebagai contoh perlindungan kue memotong tumpukan pada sisi klien mengeksploitasi. Karena kita bisa mengirim data acak dengan panjang 256 byte dan kemudian mengirim kembali data yang Timpa variabel pos dengan nilai sama dengan perbedaan antara garis dan RET disajikan di stack.
3rd kerentanan denial of service di net_get. Panjang field ditetapkan sebagai argumen len dan akan kembali dengan referensi. Akibatnya net_get akan kembali dengan panjang negatif yang dapat digunakan keliru sah.
Kode Rentan:
struct net_hdr {
static int net_get_nopacket(struct priv_net *pn, void *arg, int *len)'
{
int l;
.......
net_get( pn->pn_s, buf, &l);
.......
memcpy(arg, buf, l);
}
- CVE-2014-8323
Kerentanan terakhir adalah penolakan layanan di teman-ng fungsi menangani fungsi mengurangi dua dari argumen len dan kemudian salinan data cmd dengan panjang "len". Sebuah kesalahan segmentasi terjadi ketika len adalah sama dengan satu dan hasil pengurangan adalah -1.
Kode Rentan:
void handle_dude(int dude, int udp)
{
rc = recvfrom(udp, buf, sizeof(buf), 0,
(struct sockaddr*) &s_in, &len);
handle(dude, buf, rc, &s_in)
}
int handle(int s, unsigned char* data, int len, struct sockaddr_in *s_in)
{
.....
plen = len - 2;
.....
memcpy(cmd, data+2, plen);
}
Kode Rentan:
void handle_dude(int dude, int udp)
{
rc = recvfrom(udp, buf, sizeof(buf), 0,
(struct sockaddr*) &s_in, &len);
handle(dude, buf, rc, &s_in)
}
int handle(int s, unsigned char* data, int len, struct sockaddr_in *s_in)
{
.....
plen = len - 2;
.....
memcpy(cmd, data+2, plen);
}
Ref :
Author : Nick Sampanis
Author : Nick Sampanis
0komentar:
Post a Comment