(Ab)Using Twitter Client

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

Pendahuluan

Tutorial ini sebenarnya berhubungan dengan presentasi idsecconf 2011 yang berjudul Puzzle Hacking: How to put all puzzle in one piece. Di sini saya akan menjelaskan mengenai cara mengekstrak key dari beberapa aplikasi client untuk twitter dan nantinya akan disatukan menjadi satu aplikasi/script.


Langkah-langkah

Pada bagian ini saya akan membagi ke dalam beberapa sub, berdasarkan jenis twitter client. Dan saya hanya akan menjelaskan beberapa twitter client mainstream.


Ubersocial for Blackberry

  • Pertama, download Ubersocial untuk blackberry. Berikut ini adalah isi dari arsip Ubersocial untuk blackberry yang saya download:
$ ll
total 1.2M
-rw-r--r-- 1 dru users 4.1K May  3 12:44 BBMBridge.cod
-rw-r--r-- 1 dru users 2.0K May  3 12:44 BBMBridgeInterface.cod
-rw-r--r-- 1 dru users  907 May  4 11:02 UberSocial.alx
-rw-r--r-- 1 dru users 1.2M May  3 12:44 UberSocial.cod
-rw-r--r-- 1 dru users 3.7K May  3 12:44 UberSocial.jad
  • Target kita adalah file yang berekstensi .cod yang sebenarnya adalah file bertipe zip.
$ file UberSocial.cod
UberSocial.cod: Zip archive data, at least v1.0 to extract
  • File ini kemudian kita ekstrak ke sub direktori baru, misalnya ubersoc
$ unzip UberSocial.cod -d ubersoc
Archive:  UberSocial.cod
 extracting: ubersoc/UberSocial.cod
 extracting: ubersoc/UberSocial-1.cod
 extracting: ubersoc/UberSocial-10.cod
 extracting: ubersoc/UberSocial-11.cod
 extracting: ubersoc/UberSocial-12.cod
 extracting: ubersoc/UberSocial-13.cod
 extracting: ubersoc/UberSocial-14.cod
 extracting: ubersoc/UberSocial-15.cod
 extracting: ubersoc/UberSocial-16.cod
 extracting: ubersoc/UberSocial-2.cod
 extracting: ubersoc/UberSocial-3.cod
 extracting: ubersoc/UberSocial-4.cod
 extracting: ubersoc/UberSocial-5.cod
 extracting: ubersoc/UberSocial-6.cod
 extracting: ubersoc/UberSocial-7.cod
 extracting: ubersoc/UberSocial-8.cod
 extracting: ubersoc/UberSocial-9.cod
  • Selanjutnya kita mencari consumer_key dan consumer_secret dengan menggunakan teknik deadlisting dengan perintah strings
$ strings -f ubersoc/* | less
ubersoc/UberSocial-7.cod:1.353
ubersoc/UberSocial-7.cod:$Ø6XIk781PMICfV2w19BfQLw
--snip--
ubersoc/UberSocial-7.cod:$ØRoxBuNOkrln51abF0XT9IXevKCmbyo3dCJb435SOc4
ubersoc/UberSocial-7.cod:$ØSavings
  • Dari snippet di atas, bisa terlihat consumer_key dan consumer_secret yang kita cari:
consumer_key    = 6XIk781PMICfV2w19BfQLw
consumer_secret = RoxBuNOkrln51abF0XT9IXevKCmbyo3dCJb435SOc4


Tweetcaster for Android

  • Untuk aplikasi tweetcaster for android, kita bisa langsung melakukan proses dekompilasi menggunakan apktool seperti langkah berikut ini:
$ java -jar apktool.jar -q d tweetcaster_5.3.apk tweetcaster
  • Hasil dekompilasi dari langkah di atas bisa ditemukan pada sub direktori tweetcaster. Untuk mencari consumer_key dan consumer_secretnya, kita dapat menggunakan perintah grep.
$ grep -Rn 'const-string' tweetcaster/smali/* | less
--snip--
tweetcaster/smali/com/handmark/twitapi/TwitService.smali:38: \
const-string v0, "279MLYOwrFyFFcU6J68u6w"
tweetcaster/smali/com/handmark/twitapi/TwitService.smali:43: \
const-string v0, "ck62P6E731zXWKZgNcwu0cJh6K3LTtTOlCQfgOg"
--snip--
  • Dari snippet di atas, bisa terlihat consumer_key dan consumer_secretnya.
consumer_key    = 279MLYOwrFyFFcU6J68u6w
consumer_secret = ck62P6E731zXWKZgNcwu0cJh6K3LTtTOlCQfgOg


Twitter for iPhone

  • Aplikasi selanjutnya adalah twitter for iPhone. Sama seperti untuk aplikasi lainnya, kita cukup menggunakan teknik deadlisting :D
  • Pertama, ekstrak aplikasi twitter for iPhone
$ unzip -q Twitter-v3.3.3.ipa -d iphone
  • Selanjutnya, kita akan mencari keynya pada aplikasi Twitter di sub direktori iphone/Payload/Twitter.app:
$ file iphone/Payload/Twitter.app/Twitter
iphone/Payload/Twitter.app/Twitter: Mach-O fat file with 2 architectures
  • Kita kembali menggunakan perintah strings dan less:
$ strings iphone/Payload/Twitter.app/Twitter | less
--snip--
CjulERsDeqhhjSme66ECg
IQWdVyqFxghAtURHGeGiWAsmCAGmdW3WmbEx6Hck
IQKbtAYlXLripLGPWd0HUA
GgDYlkSvaPxGxC4X8liwpUoqKwwr3lCADbz8A7ADU
--snip--
  • Hal yang menarik adalah, kali ini kita mendapatkan dua jenis consumer_key dan consumer_secret, yaitu satu untuk aplikasi twitter for iPad dan yang satu lagi adalah twitter for iPhone.
// twitter for iPad
consumer_key    = CjulERsDeqhhjSme66ECg
consumer_secret = IQWdVyqFxghAtURHGeGiWAsmCAGmdW3WmbEx6Hck

// twitter for iPhone
consumer_key    = IQKbtAYlXLripLGPWd0HUA
consumer_secret = GgDYlkSvaPxGxC4X8liwpUoqKwwr3lCADbz8A7ADU


TweetDeck

  • Khusus untuk tweetdeck, kita akan menggunakan versi lama yang masih menggunakan adobe air.
$ file TweetDeck_0_38.2.air
TweetDeck_0_38.2.air: Zip data (MIME type \
"application/vnd.adobe.air-application-installer-package+zip"?)
  • Yang pertama akan kita lakukan adalah mengekstrak TweetDeck menggunakan unzip
$ unzip -q TweetDeck_0_38.2.air -d tweetdeck
  • Selanjutnya, kita melakukan dekompilasi pada file TweetDeck.swf menggunakan swfdump yang merupakan bagian dari swftools.
$ swfdump -D TweetDeck.swf > dump.txt
Warning: Invalid jump instruction "jump" from 12 to 133 (125)
Warning: Invalid jump instruction "jump" from 60 to 74 (68)
--snip--
  • Consumer_key dan consumer_secret dapat kita temuka pada baris 291381 dan 291382:
291381: 00004) + 2:1 pushstring "yT577ApRtZw51q4NPMPPOQ"
291382: 00005) + 3:1 pushstring "3nf83Xjdls8374hsIlksfj9393jfgjgl3SDgj3MDks"


Implementasi

Setelah menemukan consumer_key dan consumer_secret dari beberapa aplikasi di atas, kita dapat melanjutkan pada proses implementasi. Salah satu contohnya adalah, membuat seakan-akan kita melakukan update status menggunakan perangkat tertentu, misalnya blackberry, iPhone, iPad, dll. Agar lebih mudah, kita dapat melakukannya menggunakan script python, dengan bantuan library tweepy.

  • Pertama kita harus meng-approve aplikasi yang ingin kita gunakan untuk memperoleh access_token dan access_token_secret. Agar lebih mudah, kita dapat menggunakan script berikut ini:
#!/usr/bin/env python
import sys
import tweepy
import webbrowser

cl = "Twitter for iPhone"
ck = "CjulERsDeqhhjSme66ECg"
cs = "IQWdVyqFxghAtURHGeGiWAsmCAGmdW3WmbEx6Hck"

try:
    auth = tweepy.OAuthHandler(ck, cs)
    auth_url = auth.get_authorization_url()
    webbrowser.open(auth_url)
    verify = raw_input('PIN: ').strip()
    auth.get_access_token(verify)
    print "ck=%s&cs=%s&at=%s&ats=%s" % (ck, cs, auth.access_token.key, auth.access_token.secret)
    sys.exit()

except KeyboardInterrupt:
    print "\nAborted!"


  • Untuk script di atas, kita menggunakan Twitter for iPhone. Selanjutnya dengan consumer_key, consumer_secret, access_token dan access_token_secret kita bisa melakukan update status, misalnya dengan memanfaatkan script sederhana ini:
#!/usr/bin/env python
import sys
import tweepy

C_KEY = "CjulERsDeqhhjSme66ECg"
C_SEC = "IQWdVyqFxghAtURHGeGiWAsmCAGmdW3WmbEx6Hck"
A_KEY = "" # access_token dari langkah sebelumnya
A_SEC = "" # access_token_secret dari langkah sebelumnya

if __name__ == "__main__":
    try:
        msg = raw_input("Masukkan status: ")
        if len(msg) > 140:
            print "Error! status maksimal 140 karakter!"
            sys.exit()
        auth = tweepy.OAuthHandler(C_KEY, C_SEC)
        auth.set_access_token(A_KEY, A_SEC)
        api = tweepy.API(auth)
        result = api.update_status(msg)
        if result:
            print "Status berhasil di-update!"
        else:
            print "Update gagal!"
    except:
        pass


  • Untuk mempermudah, kita bisa menyatukan semua twitter client dalam satu script seperti ini:
#!/usr/bin/env python
#------------------------------------------------------------------------------
# Disclaimer: For educational purpose ONLY. Use at your own risk.
# Note      : Just comment out the app that you don't wanna use, it'll save
#             your time approving all of them.
#------------------------------------------------------------------------------
# Perhatian : Hanya untuk tujuan pembelajaran semata. Pembuat script ini tidak
#             bertanggungjawab atas penggunaan/penyalahgunaan script ini.
# Catatan   : Cukup gunakan aplikasi yang diinginkan, yang tidak digunakan bisa
#             di-comment untuk mempercepat proses approval.
#------------------------------------------------------------------------------
import sys
import tweepy

app = [
{
 'cl':'UberSocial',
 'ck':'xy2SjfpKMhDZSECIlgpS7g',
 'cs':'n2rHTrtQeuxNCJYk3l2cxM7Jf1J1mTZTfJVersSlzU',
 'ak':'',
 'as':''
},
{
 'cl':'UberSocial for Blackberry',
 'ck':'6XIk781PMICfV2w19BfQLw',
 'cs':'RoxBuNOkrln51abF0XT9IXevKCmbyo3dCJb435SOc4',
 'ak':'',
 'as':''
},
{
 'cl':'Twidroyd',
 'ck':'0YCqwPFyKUGYEZKIUrh6CA',
 'cs':'CLsIH4fMdA8nHf2jqTjGBk42MRrgyPmj2tzCwBSeU',
 'ak':'',
 'as':''
},
{
 'cl':'Twidroyd for android',
 'ck':'pCun0Kilhc6VF7fno2g',
 'cs':'3gGiWlgvMWHYy3RrFqj8jWw00kGOg9eIIqOwGiBa1c',
 'ak':'',
 'as':''
},
{
 'cl':'Twitter for Mac',
 'ck':'3rJOl1ODzm9yZy63FACdg',
 'cs':'5jPoQ5kQvMJFDYRNE8bQ4rHuds4xJqhvgNJM4awaE8',
 'ak':'',
 'as':''
},
{
 'cl':'Twitter for iPad',
 'ck':'CjulERsDeqhhjSme66ECg',
 'cs':'IQWdVyqFxghAtURHGeGiWAsmCAGmdW3WmbEx6Hck',
 'ak':'',
 'as':''
},
{
 'cl':'Twitter for iPhone',
 'ck':'IQKbtAYlXLripLGPWd0HUA',
 'cs':'GgDYlkSvaPxGxC4X8liwpUoqKwwr3lCADbz8A7ADU',
 'ak':'',
 'as':''
},
{
 'cl':'TwitBird iPad',
 'ck':'xsOKAIRcGlO8iRC5eADcw',
 'cs':'LKYXHWUbbC2MO01o7chocE2XFraSDdhurxsBXkurEK8',
 'ak':'',
 'as':''
},
{
 'cl':'TweetDeck',
 'ck':'yT577ApRtZw51q4NPMPPOQ',
 'cs':'3neq3XqN5fO3obqwZoajavGFCUrC42ZfbrLXy5sCv8',
 'ak':'',
 'as':''
},
{
 'cl':'Echofon',
 'ck':'yqoymTNrS9ZDGsBnlFhIuw',
 'cs':'OMai1whT3sT3XMskI7DZ7xiju5i5rAYJnxSEHaKYvEs',
 'ak':'',
 'as':''
},
{
 'cl':'HootSuite',
 'ck':'w1Gybt9LP9zG46mS1X3UAw',
 'cs':'hRIK4RWjAO4pokQCvmNCynRAY8Jc8edV1kcV2go6g',
 'ak':'',
 'as':''
},
{
 'cl':'Seesmic Twhirl',
 'ck':'nvyZCpiELVuWhBvPh3Sw',
 'cs':'scTemkSBpESGKBlSSCYQuinaQjpf5Hc0BBUBZpFbNsw',
 'ak':'',
 'as':''
},
{
 'cl':'Seesmic for Android',
 'ck':'WMztNBVHsW9S4QKf6S1Rg',
 'cs':'b2k7ccc9TATOqhKrB2eJpPoZabATy2yXtjJ8LlG0',
 'ak':'',
 'as':''
},
{
 'cl':'Bad Kitty',
 'ck':'U2wlL59B1VSoncuM5g',
 'cs':'470qgAWiz2Wq8zH1oTCyHol3TTwpOml4U8yeyZmxNtg',
 'ak':'',
 'as':''
},
{
 'cl':'DestroyTwitter',
 'ck':'40iqOgCcXcJYwqoa02D7nQ',
 'cs':'o0emdpQvijub2tMXpA7wAVwt3tI4FSx447NfWECS8',
 'ak':'',
 'as':''
},
{
 'cl':'Tweetcaster',
 'ck':'rvCsVGIl2etwokzk0rZ3w',
 'cs':'DeyIhM6lJKEXhutMyRWuHiAbEG7ITs12J03i0Xm4',
 'ak':'',
 'as':''
},
{
 'cl':'Tweetcaster for Android',
 'ck':'279MLYOwrFyFFcU6J68u6w',
 'cs':'ck62P6E731zXWKZgNcwu0cJh6K3LTtTOlCQfgOg',
 'ak':'',
 'as':''
},
{
 'cl':'moTweets',
 'ck':'7DIGBXQCmgR28M8AR9Q',
 'cs':'Cc2dQkA4TdMXoeuB9sedA1uxGB1zrrNmHjF3jfbhSo',
 'ak':'',
 'as':''
},
{
 'cl':'ChromedBird',
 'ck':'KkrTiBu0hEMJ9dqS3YCxw',
 'cs':'MsuvABdvwSn2ezvdQzN4uiRR44JK8jESTIJ1hrhe0U',
 'ak':'',
 'as':''
},
{
 'cl':'TwittAMP',
 'ck':'XHOuZ5bBMAMleIpm4h28JA',
 'cs':'nZ0IsdMUSdSSuSIDojjpVxYqCeXIBCPii5o565DKs',
 'ak':'',
 'as':''
},
{
 'cl':'Mixero',
 'ck':'bJaKx0V8hdDAfQFXK4P08g',
 'cs':'DRSZv2Bc1Qgl0HDe7gGjZXYuQwkwk9gZAYgEFNnWJs',
 'ak':'',
 'as':''
},
{
 'cl':'detikcom for Blackberry',
 'ck':'SWtEBuWHarToHiCP7o1uUA',
 'cs':'gJJtTr3x5Jpv8dGjXKksgkmSrWUxk3TGEOj0DXCc4gg',
 'ak':'',
 'as':''
},
{
 'cl':'detikcom for iPhone',
 'ck':'pYHDVBc04K4EAhUyImw',
 'cs':'CpLMtELKahoqhSli1ZrEaZt6EvJevCSZ1XDoGdBU',
 'ak':'',
 'as':''
},
{
 'cl':'detikcom for Android',
 'ck':'kD5eBZypDVLPlXJVuxmaUw',
 'cs':'PekMoIZkcYy63JCdEdej5CVaxywIJsjrxPjjXX9qGI',
 'ak':'',
 'as':''
},
{
 'cl':'A.Plus App',
 'ck':'DC2XbSUhfLntKJX2XhSBg',
 'cs':'Vd0CL3NFXgQdfg0qxPRLybuBfR6wj58R5Dl7fbJw',
 'ak':'',
 'as':''
},
{
 'cl':'Jing',
 'ck':'9tGyVimyayvyqUlz7L7JYA',
 'cs':'PcBO252zXfSh4SljRY0kp7rZvWeF4lq2k0lYycu0',
 'ak':'',
 'as':''
},
{
 'cl':'Blaq for Playbook',
 'ck':'lRFo1RRPXusr9GAORfms7w',
 'cs':'uqujPqX6YRNT2BZ7zPu0IdIZCk3DYojpIPr3Vwgk',
 'ak':'',
 'as':''
},
{
 'cl':'Instagram',
 'ck':'7YBPrscvh0RIThrWYVeGg',
 'cs':'sMO1vDyJ9A0xfOE6RyWNjhTUS1sNqsa7Ae14gOZnw',
 'ak':'',
 'as':''
},
{
 'cl':'Mindtalk for Android',
 'ck':'SGvBZnSxHbBdwcNncowOBQ',
 'cs':'ZmimffOX0ObOFD2piPUY22U3mTZKEtbm2nUP61QHp8',
 'ak':'',
 'as':''
},
{
 'cl':'twitbot for iOS',
 'ck':'8AeR93em84Pyum5i1QGA',
 'cs':'ugCImRuw376Y9t9apIq6bgWGNbb1ymBrx2K5NK0ZI',
 'ak':'',
 'as':''
},
{
  'cl':'MivoTV',
  'ck':'7A6TSGzUKxGSIxZKCsXsmA',
  'cs':'4PgJEFC7ovURlrkS9qWtAIrpyHKddsZfq00GVw962o',
  'ak':'',
  'as':''
},
{
  'cl':'Path 2.0',
  'ck':'9UiCHv8e9fXfdYiIK26Jfg',
  'cs':'qFcIA6Jo7mNURwzpdw1ieXkSzK4vwtF2O6NKo7i8',
  'ak':'',
  'as':''
},
]

loc = [
['Jakarta, Setiabudi',-6.217503,106.832385],
['Jakarta, Kebayoran',-6.256175,106.812301],
['Magelang, Borobudur',-7.603182,110.204067],
['Turki, Istanbul',40.976922,28.81460],
['Libya, Tripoli',32.876174,13.187507],
['Libya, Secretariat of Land Reclamation',32.8646,13.2153],
['Mt.Fuji',35.3624000549,138.725997925],
['Mt.Aso',32.86961476482221,131.0673704725062],
['Fountain of Youth',41.978469,-122.709753],
['Hang Nadim Batam',1.12575,104.112]
]

def get_auth(a):
    try:
        auth = tweepy.OAuthHandler(a['ck'], a['cs'])
        auth_url = auth.get_authorization_url()
        print 'Please authorize: ' + auth_url
        verify = raw_input('PIN: ').strip()
        auth.get_access_token(verify)
        print "'cl':'%s'\n'ak':'%s'\n'as':'%s'" % (a['cl'], auth.access_token.key, auth.access_token.secret)
        sys.exit()
    except KeyboardInterrupt:
        print "\nAborted!"

if __name__ == '__main__':
    try:
        for a in app:
            if (not a['ak']) or (not a['as']): get_auth(a)

        if len(sys.argv) < 2:
            msg = raw_input('[*] Enter status: ')
        else:
            msg = sys.argv[1]

        if len(msg) > 140:
            raise Exception('[-] status message is too long!')

        i = 0
        print '[*] Update Via:'
        for v in app:
            print "[*] %s. %s" % (i+1 , v['cl'])
            i += 1

        x = int(raw_input('[?] Update Via: '))
        if x > i:
            print '[-] Choose valid apps!'
            sys.exit()
        x -= 1

        i = 0
        print '[*] Choose Location:'
        for l in loc:
            print "[*] %s. %s" % (i+1 , l[0])
            i += 1

        p = int(raw_input('[?] Location Number: '))
        if p > i:
            print '[-] Invalid location!'
            sys.exit()
        p -= 1

        auth = tweepy.OAuthHandler(app[x]['ck'], app[x]['cs'])
        auth.set_access_token(app[x]['ak'], app[x]['as'])
        api = tweepy.API(auth)
        result = api.update_status(msg, lat=loc[p][1], long=loc[p][2])
        if result:
            print '[*] Status updated from ' + loc[p][0] + '!'
        else:
            print "[-] Update failed!"

    except KeyboardInterrupt:
        print "\n[-] aborted!"
        sys.exit()


Penutup

Sekian tutorial kali ini, semoga dapat bermanfaat. Terima kasih kepada Tuhan Yang Maha Esa, RNDC, Maxindo, 1st****, dan Anda yang telah membaca tutorial ini.