GOPHERSPACE.DE - P H O X Y
gophering on sdf.org
Sekilas VFS pada linux kernel 2.4

[vfs]
Sekilas VFS pada linux kernel 2.4

[vfs]
vfs (virtual file system) merupakan layanan file system yang disediakan 
oleh kernel untuk tampilan filesystem
di user space.

karena hanya berupa tampilan virtual maka kita sebut sbg pseudo file 
system.

[/proc/net filesystem]
dengan memodifikasi struktur proc_dir_entry pada vfs digunakan untuk 
menyembunyikan koneksi, misal dari program 2 yang mencoba membaca2 socket2 
dari /proc/net/*

misal pada netstat akan membaca dari /proc/net/tcp / /proc/net/udp , dll

====
if (flags & NETSTAT_TCP) {
do_info("/proc/net/tcp", tcp_do_one);
#if ENABLE_FEATURE_IPV6
do_info("/proc/net/tcp6", tcp_do_one);
#endif
}
if (flags & NETSTAT_UDP) {
do_info("/proc/net/udp", udp_do_one);
#if ENABLE_FEATURE_IPV6
do_info("/proc/net/udp6", udp_do_one);
#endif
}
if (flags & NETSTAT_RAW) {
do_info("/proc/net/raw", raw_do_one);
#if ENABLE_FEATURE_IPV6
do_info("/proc/net/raw6", raw_do_one);
#endif
}
==============

do_info digunakan untuk membaca /proc/net/* dengan menggunakan fungsi 
fopen_or_warn_stdin.




=======================
struct proc_dir_entry
{
............................
int (*get_info)(buffer, start, off, count);
int (*read_proc) (buffer, start, off, count, eof, data);
.........................
};
=================

struktur proc_dir_entry berisi : int (*get_info)(buffer, start, off, 
count); yang merupakan function pointer. jika proc_dir_entry tidak ada
int (*get_info) maka akan digunakan int (*read_proc), misal
saat get_info , salah satu teknik attacker untuk menyembunyikan proses 
dengan meredirect fungsi get_info di contoh di bawah dengan
fungsi new_get_info:

=============
int new_get_info (char *a, char **b, off_t c, int d, int e) {
int x = 0;
x = saved_get_info (a, b, c, d, e);
/* do something here ... */
return x;
}
===============

sebelumnya telah kita definisikan dengan:
==================
int (*saved_get_info)(char *, char **, off_t, int, int);
===================

teknik yang dilakukan hanya melakukan redireksi pointer get_info untuk 
menunjuk ke fungsi redireksi :"new_get_info" yang telah disiapkan.



=================
saved_get_info = a->get_info;
a->get_info = &new_get_info;
==================

sehingga a->get_info akan menunjuk pada alamat fungsi new_get_info di 
memori.

jika kita lihat pada new_get_info:
=======================

return x;
=======================

yang akan melakukan jmp kembali karena:

==================
x = saved_get_info (a, b, c, d, e);

====================

karena x menyimpan alamat asli get_info



[menyembunyikan proses tanpa modifikasi syscall ]

elf "ps" saat dijalankan akan membaca proses pada /proc dg readdir,

coba perhatikan potongan kode ini:
=========
while ((entry = readdir(dir)) != NULL) {
uidName[0] = '\0';
groupName[0] = '\0';

if (!isdigit(*entry->d_name))
continue;
sprintf(path, "/proc/%s/status", entry->d_name);
if ((file2str(path, sbuf, sizeof sbuf)) != -1) {
parse_proc_status(sbuf, &p);
}
dst......

==============

potongan kode di atas berada pada fungsi ps_main yang akan dijalankan
saat seorang user menjalankan elf lsb executable ps, di mana kita bisa 
melihat penggunaan fungsi readdir

teknik yang bisa kita lakukan dengan redirek pointer ke fungsi readdir 
misal dengan fungsi palsu new_readdir_root:

==========
/* replace the readdir file operation. */
proc_root.FILE_OPS->readdir = new_readdir_root;
============