Add files via upload
This commit is contained in:
BIN
Sandworm/Appendix_Cyclops Blink Sets Sights on ASUS Routers.pdf
Normal file
BIN
Sandworm/Appendix_Cyclops Blink Sets Sights on ASUS Routers.pdf
Normal file
Binary file not shown.
BIN
Sandworm/Cyclops-Blink-Malware-Analysis-Report.pdf
Normal file
BIN
Sandworm/Cyclops-Blink-Malware-Analysis-Report.pdf
Normal file
Binary file not shown.
@@ -0,0 +1,75 @@
|
|||||||
|
C&C Server Validation Script
|
||||||
|
|
||||||
|
To validate a host suspected of being a Cyclops Blink C&C server,
|
||||||
|
we wrote a script that would perform the TLS handshake, send
|
||||||
|
a 4-byte packet, and wait for the 4-byte response from the
|
||||||
|
server. The source code for the script is as follows:
|
||||||
|
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import socket
|
||||||
|
import ssl
|
||||||
|
import sys
|
||||||
|
import requests
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
def usage():
|
||||||
|
print("Usage:\n\t{0} HOST[:]PORT\n\nExamples:\n\t{0}
|
||||||
|
8.8.8.8 443\n\t{0}
|
||||||
|
9.9.9.9:666\n".format(Path(__file__).name))
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
def myip():
|
||||||
|
r = requests.get('https://api.ipify.org?format=json')
|
||||||
|
return r.json()['ip']
|
||||||
|
|
||||||
|
def check_cyclops_blink_c2(hostname, port, extaddr):
|
||||||
|
ctx = ssl.create_default_context()
|
||||||
|
ctx.check_hostname = False # Disables hostname checking
|
||||||
|
ctx.verify_mode = ssl.CERT_NONE # Do not verify the
|
||||||
|
certificate
|
||||||
|
|
||||||
|
veredict = 'NOT DETECTED'
|
||||||
|
response = ''
|
||||||
|
|
||||||
|
try:
|
||||||
|
with socket.create_connection((hostname, port),
|
||||||
|
timeout=5) as sock:
|
||||||
|
with ctx.wrap_socket(sock,
|
||||||
|
server_hostname=hostname) as ssock:
|
||||||
|
ssock.settimeout(10)
|
||||||
|
ssock.send(b'\x00\x00\x00\x08')
|
||||||
|
response = ssock.read(2048)
|
||||||
|
if len(response) == 4:
|
||||||
|
veredict = 'POSSIBLE'
|
||||||
|
if socket.inet_ntoa(response) == extaddr:
|
||||||
|
veredict = 'ACTIVE'
|
||||||
|
ssock.close()
|
||||||
|
except:
|
||||||
|
veredict = 'UNREACHABLE'
|
||||||
|
|
||||||
|
print(hostname,
|
||||||
|
port,
|
||||||
|
len(response),
|
||||||
|
response,
|
||||||
|
veredict)
|
||||||
|
|
||||||
|
def main(argv):
|
||||||
|
if len(argv) < 2:
|
||||||
|
usage()
|
||||||
|
|
||||||
|
# Accepts both host:port or host<space>port
|
||||||
|
pos = sys.argv[1].find(':')
|
||||||
|
if pos != -1:
|
||||||
|
hostname = sys.argv[1][:pos]
|
||||||
|
port = sys.argv[1][pos+1:]
|
||||||
|
else:
|
||||||
|
if len(argv) < 3:
|
||||||
|
usage()
|
||||||
|
hostname = sys.argv[1]
|
||||||
|
port = sys.argv[2]
|
||||||
|
|
||||||
|
check_cyclops_blink_c2(hostname, port, myip())
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main(sys.argv)
|
||||||
Reference in New Issue
Block a user