Code

레지스트리의 무선 AP 분석 [Python]

Ohs_ 2020. 2. 7. 19:12

 - 레지스트리 무선 AP 분석 : 무선 네트워크의 연결에 대한 정보를 레지스터에서 갖고 있는데 해당 정보를 가져와서 읽는 것이다. 포렌식 수사에서도 사용된 일이 있는데 해당 경우에는 범인이 어느 장소에 위치해 있는지 확인하는 용도로 사용을 했다고 한다.

from _winreg import *

def val2addr(val):
    addr = ''

    for ch in val:
        addr += '%02x '% ord(ch)

    addr = addr.strip(' ').replace(' ', ':')[0:17]

    return addr

def printNets():
    net = "SOFTWARE\Microsoft\Windows NT\CurrentVersion"+\
            "\NetworkList\Signatures\Unmanaged"
    key = OpenKey(HKEY_LOCAL_MACHINE, net)

    print '\n[*] Networks You have Joined.'

    for i in range(100):
        try:
            guid = EnumKey(key, i)
            netKey = OpenKey(key, str(guid))

            (n, addr, t) = EnumValue(netKey, 5)
            (n, name, t) = EnumValue(netKey, 4)

            macAddr = val2addr(addr)
            netName = str(name)
            
            print '[+] ' + netName + ' ' + macAddr

            CloseKey(netKey)

        except:
            break

def main():
    printNets()

if __name__ == "__main__":
    main()

<코드 설명>

 

사용 모듈 : _winreg


_winreg : window에 있는 모듈이며 윈도우 운영체제의 레지스터리를 관리, 제어할 때 사용하는  모듈이다.



def val2addr(val):
    addr = ''

    for ch in val:
        addr += '%02x '% ord(ch)

    addr = addr.strip(' ').replace(' ', ':')[0:17]

    return addr


 - 'addr' 변수의 선언과 함께 반복문을 이용하여 사용자의 MAC주소(물리적 주소)를 'addr' 변수에 넣어 주는 작업을 합니다. 그리고 사용하기 좋은 형태로 만들기 위해 'strip' 함수를 이용하여 문자열의 양 끝 공백을 제거해주고 'replace' 함수를 이용하여 남은 공백을 ':' 로 바꿔 줍니다. 그리고 해당 MAC주소를 반환합니다.



def printNets():
    net = "SOFTWARE\Microsoft\Windows NT\CurrentVersion"+\
            "\NetworkList\Signatures\Unmanaged"
    key = OpenKey(HKEY_LOCAL_MACHINE, net)

    print '\n[*] Networks You have Joined.'

 - 'printNets' 함수 입니다. 'net' 변수에 무선 네트워크에 대한 정보가 저장되는 윈도우 레지스터 경로를 입력해 줍니다. 그리고 'key' 변수에는 해당 경로 내부에 필요로 하는 정보를 입력해 줍니다. 



    for i in range(100):
        try:
            guid = EnumKey(key, i)
            netKey = OpenKey(key, str(guid))

            (n, addr, t) = EnumValue(netKey, 5)
            (n, name, t) = EnumValue(netKey, 4)

            macAddr = val2addr(addr)
            netName = str(name)

            print '[+] ' + netName + ' ' + macAddr

            CloseKey(netKey)

        except:
            break

 

 - 'guid' 변수는 'EnumKey' 함수를 사용하여 해당 레지스터리 내부의 키와 문자열을 불러옵니다. 

'neyKey' 변수는 'OpenKey' 함수를 이용하여 레지스터리 키와 원하는 문자열을 반환 합니다. 다음 3개의 변수로 저장하는 부분은 'EnumValue' 함수를 이용하여 레지스터의 키 값과 튜플(튜플은 리스트 즉, 배열과 비슷하지만 가장 큰 특징은 배열과 데이터를 입력하는 방법이 다릅니다. '[]' 를 이용하는 것이 아닌 ','를 사용합니다. 그리고 가장 중요한 것은 배열의 값은 변화가 가능하지만 튜플은 값이 변화하지 않습니다. 즉, 변화하지 않는 값을 넣어주고 싶을 때 튜플을 사용하면 됩니다.)을 반환합니다. 'EnumValue'를 이용하여 생성되는 값이 3개여서 3개의 변수에 각각을 넣어줍니다. 'n'에는 인덱스 num이 들어가고 'addr' 에는 키값 't' 에는 튜플값이 들어갑니다.

 'macAddr' 변수에는 앞에 작성한 함수 'val2addr' 함수의 값이 저장됩니다. MAC주소가 저장되겠지요. 'netName' 변수는 앞서 뽑아낸 'name' 키 값을 'str' 으로 변환 시켜 줍니다. 

 마지막으로 열었던 레지스터리 키를 닫으면서 해당 작업을 100번 반복합니다.



def main():
    printNets()

if __name__ == "__main__":
    main()

 

 - 마지막으로 함수 호출을 통해 해당 코드가 마무리 됩니다. 무선 네트워크 접속에 대한 정보를 윈도우 레지스터를 통해 쭉 뽑아 냅니다.

반응형