Обхванала ме е една нова краста - пиша си един прост kernel rootkit, просто за да видя дали ще мога да се справя и защото ми е интересно (както винаги като ми дойде такава краста откривам разни забавни нови неща).
Методът, който ползвам е много прост и изтъркан - hijack-вам sys_call_table[]. Понеже таблицата в 2.6 не се експорт-ва съм си реализирал един procfs интерфейс, чрез който подавам от userspace-a адреса на sys_call_table[] (който вземам от System.map). Сега това е доста малоумно като цяло, знам че има доста по-advanced методи, като например тези дето си играят с debug регистрите, знам също и че зависи от System.map (това не е особен проблем, мога да го накарам да зависи и от /proc/kallsyms и да сканира област от паметта, но това не е толкова важно).
Засега успях вече да реализирам криене на файлове (това е елементарно, пипам sys_getdents() и където видя въпросният файл просто го подменям с "..\0" доста просто и ефективно).
Реализирах и криене на процеси (също не е голяма философия). В случаят правя един глупав номер - прихващам sys_chdir() и ако директорията е един определен стринг, слагам на current (тоя отдето е влезнато в kernelmode) task_struct-а полето pid=0. Убийствено ефективно, процесът престава да съществува запред procfs и никой не може да го види. Единственият проблем е ако процесът някъде викне exit() което краш-ва ядрото. За целта прихванах и sys_exit()/sys_exit_group() така че ако current task_struct->pid ==0, да го смени на current task_struct->tgid и чак тогава да викне оригиналният sys_exit(). Стана си стабилно и работи много добре. Просто трябва като си викнете bash shell-a да напишете "cd secretstring" и шела престава да съществува.
Реализирах и ескалиране на привилегии - по елементарен начин, много подобно на горния пример - на current task_struct->uid се дава стойност 0. При което процесът започва да работи с root привилегии, което е доста забавно
Сега остава да почна да крия сокети, за което имам идея как да стане - ще трябва обаче да прихвана sys_read() най-вероятно.
Другото което е - да скрия модула от списъка със заредени такива - не съм убеден, че ще стане, но доколкото знам всички заредени модули се пазят в някакъв свързан списък - просто ще разкарам моят оттам ако е възможно. Това още не съм го проучил, но не мисля, че ще е проблем. Ако ли не, ще видя дали не мога да направя нещо по въпроса с четенето от /proc/modules.
Сега остава най-забавното, за което нямам много идея как да стане - да си осигурим remote достъп. Разбира се мога да bind-на един сокет с nc, той да вика шел когато се вържеш (nc -l port -c /bin/bash) и да ги скрия, ама това не е много умно. Първо защото ще има слухтящ сокет, дори да го скрия от procfs (съответно netstat), едно сканиране на машината с nmap ще го покаже и ще почнат подозрения.
За целта мисля да пробвам с нещо, дето се занимавах преди време - netfilter hooks. Ще сет-на един такъв, който дроп-ва пакетите на този порт освен ако не са от определен source адрес. Ще е малко грубо, но ще свърши работа.
Обаче не знам...само това ли трябва да се очаква от един rootkit?
Гледах значи 1-2 писани неща...там те крият когато някой интерфейс влезе в promiscuous режим (това нямам идея как да го направя). Могат да логват нещата минали през tty-та, което ми се вижда леко безсмислено.
И въпреки това, каква още функционалност би следвало да има (освен криене на процеси/сокети/файлове)?
Другото което ми е много интересно е някакъв начин това да може да се зарежда автоматично при reboot (достатъчно скрито - като редактираш инитскриптове това обикновено се забелязва). Може би може да се измисли някаква схема с инитскриптовете където модификацията се "скрива" от администратора, но това ми се вижда ужасно сложна работа за реализация в kernelmode. Дали няма някакъв по-лесен начин?
Също така ми е интересно какво още би трябвало да се скрие? Аз мислех по въпроса че ще е добре да се предпазя от възможността скрит процес да пише неща в syslog, би било голяма простотия. Също така хахорската намеса просто лъщи като разгледаш /proc/kallsyms, поради което и там ще трябва да направя нещо по въпроса. Но честно казано идеите ми са дотам.
Та ми е интересно да чуя вие какво мислите? Примерно ако се усъмните, че някой ви е хахорнал машинката, какво бихте проверили?
А, да, срещу rkhunter още не съм правил тестове, рано е още