Secure SHell

  • Category: Crypto
  • Points: 500
  • Solves: 0

Description

This SSH client was modified. It has made a trivial choice for its random. This made all SSH packets transparent.

Download: SecureSHell.zip

Files

In [1]:
import os, zipfile
from Serializer.Base import *
from FileFormat import PCAPNG
from Base.Show import *
from Network.TCP import *
from Network.SSH import *
In [2]:
base = "/home/chihong/sambashare/CTF/events/2020-08-18_Hackers_Playground/Secure_SHell/"
files = os.listdir(base)
print(files)
['DecryptSSH.pcapng', 'writeup.ipynb', 'SecureSHell.zip', '.ipynb_checkpoints', 'README.md']
In [3]:
src = f"{base}/{files[2]}"
dest = f"{base}"
zipfile.ZipFile(src).extractall(dest)
In [4]:
fp = f"{base}/{files[0]}"
data = open(fp, "rb").read()
print(len(data))
10344
In [6]:
result = DeserializeIterate(PCAPNG.General_Block, data)
print(len(result))
packets = list()
for item in result:
    #print("="*100)
    #ShowDict(item)
    if item["type"][2] == "Enhanced Packet Block":
        packet_data = item["data"]["packet"][2]
        packet = Unpack(Ethernet2, packet_data)
        if packet["ether type"] == "IPv4":
            packet["payload"] = Unpack(IPv4, bytes.fromhex(packet["payload"]))
            if packet["payload"]["protocol"] == "TCP":
                packet["payload"]["payload"] = Unpack(TCP, bytes.fromhex(packet["payload"]["payload"]))
                packets.append(packet)
print(len(packets))
54
51
In [7]:
payloads = list()
for idx, packet in enumerate(packets):
    print("="*100)
    #ShowDict(packet)
    stream = packet["payload"]["payload"]
    size = 0
    if "payload" in stream.keys():
        size = len(stream["payload"])//2
    flags = str()
    items = ["NS", "CWR", "ECE", "URG", "ACK", "PSH", "RST", "SYN", "FIN"]
    for item in items:
        if stream[item]:
            flags += item + " "
    source = f"{packet['payload']['source ip address']}:{stream['source port']}"
    destination = f"{packet['payload']['destination ip address']}:{stream['destination port']}"
    print(f"{idx:3}-th packet {source:>22} -> {destination:<22} {flags:16} payload {size} bytes")
    if size > 0:
        print("-"*100)
        print(f"{len(payloads)}-th payloads\t{stream['payload']}")
        payloads.append(bytes.fromhex(stream["payload"]))
print(len(payloads))
====================================================================================================
  0-th packet   10.113.108.237:33862 -> 10.113.109.133:22      SYN              payload 0 bytes
====================================================================================================
  1-th packet      10.113.109.133:22 -> 10.113.108.237:33862   ACK SYN          payload 0 bytes
====================================================================================================
  2-th packet   10.113.108.237:33862 -> 10.113.109.133:22      ACK              payload 0 bytes
====================================================================================================
  3-th packet      10.113.109.133:22 -> 10.113.108.237:33862   ACK PSH          payload 41 bytes
----------------------------------------------------------------------------------------------------
0-th payloads	5353482d322e302d4f70656e5353485f372e367031205562756e74752d347562756e7475302e330d0a
====================================================================================================
  4-th packet   10.113.108.237:33862 -> 10.113.109.133:22      ACK              payload 0 bytes
====================================================================================================
  5-th packet   10.113.108.237:33862 -> 10.113.109.133:22      ACK PSH          payload 41 bytes
----------------------------------------------------------------------------------------------------
1-th payloads	5353482d322e302d4f70656e5353485f372e327032205562756e74752d347562756e7475322e380d0a
====================================================================================================
  6-th packet      10.113.109.133:22 -> 10.113.108.237:33862   ACK              payload 0 bytes
====================================================================================================
  7-th packet      10.113.109.133:22 -> 10.113.108.237:33862   ACK PSH          payload 1080 bytes
----------------------------------------------------------------------------------------------------
2-th payloads	0000043406141618f59c017d5c1a820ab12e25c90ec700000102637572766532353531392d7368613235362c637572766532353531392d736861323536406c69627373682e6f72672c656364682d736861322d6e697374703235362c656364682d736861322d6e697374703338342c656364682d736861322d6e697374703532312c6469666669652d68656c6c6d616e2d67726f75702d65786368616e67652d7368613235362c6469666669652d68656c6c6d616e2d67726f757031362d7368613531322c6469666669652d68656c6c6d616e2d67726f757031382d7368613531322c6469666669652d68656c6c6d616e2d67726f757031342d7368613235362c6469666669652d68656c6c6d616e2d67726f757031342d73686131000000417373682d7273612c7273612d736861322d3531322c7273612d736861322d3235362c65636473612d736861322d6e697374703235362c7373682d656432353531390000006c63686163686132302d706f6c7931333035406f70656e7373682e636f6d2c6165733132382d6374722c6165733139322d6374722c6165733235362d6374722c6165733132382d67636d406f70656e7373682e636f6d2c6165733235362d67636d406f70656e7373682e636f6d0000006c63686163686132302d706f6c7931333035406f70656e7373682e636f6d2c6165733132382d6374722c6165733139322d6374722c6165733235362d6374722c6165733132382d67636d406f70656e7373682e636f6d2c6165733235362d67636d406f70656e7373682e636f6d000000d5756d61632d36342d65746d406f70656e7373682e636f6d2c756d61632d3132382d65746d406f70656e7373682e636f6d2c686d61632d736861322d3235362d65746d406f70656e7373682e636f6d2c686d61632d736861322d3531322d65746d406f70656e7373682e636f6d2c686d61632d736861312d65746d406f70656e7373682e636f6d2c756d61632d3634406f70656e7373682e636f6d2c756d61632d313238406f70656e7373682e636f6d2c686d61632d736861322d3235362c686d61632d736861322d3531322c686d61632d73686131000000d5756d61632d36342d65746d406f70656e7373682e636f6d2c756d61632d3132382d65746d406f70656e7373682e636f6d2c686d61632d736861322d3235362d65746d406f70656e7373682e636f6d2c686d61632d736861322d3531322d65746d406f70656e7373682e636f6d2c686d61632d736861312d65746d406f70656e7373682e636f6d2c756d61632d3634406f70656e7373682e636f6d2c756d61632d313238406f70656e7373682e636f6d2c686d61632d736861322d3235362c686d61632d736861322d3531322c686d61632d73686131000000156e6f6e652c7a6c6962406f70656e7373682e636f6d000000156e6f6e652c7a6c6962406f70656e7373682e636f6d00000000000000000000000000000000000000
====================================================================================================
  8-th packet   10.113.108.237:33862 -> 10.113.109.133:22      ACK              payload 0 bytes
====================================================================================================
  9-th packet   10.113.108.237:33862 -> 10.113.109.133:22      ACK PSH          payload 224 bytes
----------------------------------------------------------------------------------------------------
3-th payloads	000000dc16143031323334353637383961626364656600000012656364682d736861322d6e697374703235360000001365636473612d736861322d6e697374703235360000000a6165733132382d6374720000000a6165733132382d6374720000000d686d61632d736861322d3235360000000d686d61632d736861322d3235360000001a6e6f6e652c7a6c6962406f70656e7373682e636f6d2c7a6c69620000001a6e6f6e652c7a6c6962406f70656e7373682e636f6d2c7a6c69620000000000000000000000000000000000000000000000000000000000000000000000
====================================================================================================
 10-th packet      10.113.109.133:22 -> 10.113.108.237:33862   ACK              payload 0 bytes
====================================================================================================
 11-th packet   10.113.108.237:33862 -> 10.113.109.133:22      ACK PSH          payload 96 bytes
----------------------------------------------------------------------------------------------------
4-th payloads	0000005c151e00000041046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5000000000000000000000000000000000000000000
====================================================================================================
 12-th packet      10.113.109.133:22 -> 10.113.108.237:33862   ACK              payload 0 bytes
====================================================================================================
 13-th packet      10.113.109.133:22 -> 10.113.108.237:33862   ACK PSH          payload 312 bytes
----------------------------------------------------------------------------------------------------
5-th payloads	00000124091f000000680000001365636473612d736861322d6e69737470323536000000086e69737470323536000000410416e8ab3d445033022b1382216ced108d652ca7e1971c74bd94a706133982d9e770f223bb41d1b51648a2afc3f92c2ceecc1d179063c225f9cf7bdeb77740618600000041043056e155b9de52d65bad8cf17517b1f0bd463f44ad1feb7443fdc9a4db34e4708d7c82f88b9a8e045096cb777be60061672257889228b1116a7bccc01ebfc757000000640000001365636473612d736861322d6e6973747032353600000049000000207cd5a995cb4acb844acd3d65ca193fadd966d7daed18c05ac765d5c6063c799b0000002100b1b9784938454d100112e2666e74ba900103af72a0ff4d06dc6e901acb6d20b80000000000000000000000000c0a1500000000000000000000
====================================================================================================
 14-th packet   10.113.108.237:33862 -> 10.113.109.133:22      ACK              payload 0 bytes
====================================================================================================
 15-th packet   10.113.108.237:33862 -> 10.113.109.133:22      ACK PSH          payload 16 bytes
----------------------------------------------------------------------------------------------------
6-th payloads	0000000c0a1500000000000000000000
====================================================================================================
 16-th packet      10.113.109.133:22 -> 10.113.108.237:33862   ACK              payload 0 bytes
====================================================================================================
 17-th packet   10.113.108.237:33862 -> 10.113.109.133:22      ACK PSH          payload 64 bytes
----------------------------------------------------------------------------------------------------
7-th payloads	571882a3c43bffeb08cb0d71f27d24a0beb7487cdf55cce13c860b8ef25071706a078dc35c4020095c111853380ca1973cfb0444d1c397991f634d4801469846
====================================================================================================
 18-th packet      10.113.109.133:22 -> 10.113.108.237:33862   ACK              payload 0 bytes
====================================================================================================
 19-th packet      10.113.109.133:22 -> 10.113.108.237:33862   ACK PSH          payload 64 bytes
----------------------------------------------------------------------------------------------------
8-th payloads	9f338cc104371c45d4a162501e2dbfa0c2e64aee242b07797fd6ad4e57fbaed3ad7edd524d4843dc50fa513f6893f19b784deb96b974a58784117c34adb3c9c3
====================================================================================================
 20-th packet   10.113.108.237:33862 -> 10.113.109.133:22      ACK              payload 0 bytes
====================================================================================================
 21-th packet   10.113.108.237:33862 -> 10.113.109.133:22      ACK PSH          payload 112 bytes
----------------------------------------------------------------------------------------------------
9-th payloads	101ee06c537db304e8208235b23370f126599c6d50c001f699886e8eac80b3377eefbc958e48e5390bee12b9f4823e0f20ad2de466acd54d1dc37804be74d855771d8e8076f1903160b9ed80212aa114a23f137fb6f667977a42e704a774b28f38a4c5418f9bc13bf62a27b81667a616
====================================================================================================
 22-th packet      10.113.109.133:22 -> 10.113.108.237:33862   ACK PSH          payload 48 bytes
----------------------------------------------------------------------------------------------------
10-th payloads	33ee5ff964b75b7c41eb049756601b6946d614e9ccccc912b63d4eb288be91aed9e852d3e1d8d61f768cd047a29b838a
====================================================================================================
 23-th packet   10.113.108.237:33862 -> 10.113.109.133:22      ACK              payload 0 bytes
====================================================================================================
 24-th packet      10.113.109.133:22 -> 10.113.108.237:33862   ACK PSH          payload 528 bytes
----------------------------------------------------------------------------------------------------
11-th payloads	00426c553a03e2abd00dd406e318ac9d6264bb94d4190c053e266ead909980f1f82c70fa9ce7ef58c27b4459d4ac9a883d43664273135e05b9e11df400acd04f22cfbf1c003aa508181ba93a5751bf5b9d65242c79e17f8d8501abd329cd7ca338c8385fa444a7d07698a3d8805cfd54cb35c4c62bf1302e0e468ef7893139f3abb37014a49baa04d4135299863d269f405acb55cdf3bdb9c1a4b8b8bb61baf96ec256569f97fd912ba1b5427da066a3260dff8d007eef3e89fc4e73e169d4e67c66148d123ecf22df68e97b9fdc76a66df050ce6be30f3058931a87440e6ccd07a14f4601195102b95ffc67bf19ff3c1b7202ec9e7860830adbf810e7b12199a045374414f5df3c477dd2b08f9be70a5ce9ca0907028a5a4a21488d09f492dc899112ae2080f2c27e92b468de79a074f63e4ba4b76ca701116868a46335b453557fd994c58db3b9a07bdb9c74fd335756922acbdc2cad980dded3e41afb3f0a5372787aa6cde648ac15f39c42980a50ebf83112937edf61e6942a26eb2425d6df9d1935d5b09f675d09954c9b13e333dcc14f194e76c312e66357c83283da5b4b8c1e1172048784d8e8b6971956ef2247f02bb9f407a8c2b4cbb7dfb2432964b79fe70537291d2e9de70ac6e1dc497b2a3ee233f279e9ac66e55b267bc5f9895745af9df13c7ac81ea431486235310d0b79ee49bf6cf4ed304018238b1b5ad083087acb5abe52de7316042ffe05f8c0
====================================================================================================
 25-th packet   10.113.108.237:33862 -> 10.113.109.133:22      ACK              payload 0 bytes
====================================================================================================
 26-th packet   10.113.108.237:33862 -> 10.113.109.133:22      ACK PSH          payload 80 bytes
----------------------------------------------------------------------------------------------------
12-th payloads	3c45ffc7122f8fc4a6a799ac80b8a3e3689182c86f09cb8b51a5edc32f258676815bb94067565018eb1e37eb42a951ed94e72815564d437e0b0d2aca8bd99c14d58e321d5de2feed1bd63106c22e4f6a
====================================================================================================
 27-th packet      10.113.109.133:22 -> 10.113.108.237:33862   ACK PSH          payload 64 bytes
----------------------------------------------------------------------------------------------------
13-th payloads	eee26f3650f68bef3bd1d72b52aa2f42006f7544b6def65bcd12ca88abd72f11e9102ba1bb2a2ea62464e1a4e9fc0fec57d433aa6c41c01de037e81bad823f3b
====================================================================================================
 28-th packet   10.113.108.237:33862 -> 10.113.109.133:22      ACK              payload 0 bytes
====================================================================================================
 29-th packet   10.113.108.237:33862 -> 10.113.109.133:22      ACK PSH          payload 64 bytes
----------------------------------------------------------------------------------------------------
14-th payloads	2d18a1b8a1e03a1c947c5a278e3cf9d16606d9ad732c3e94f7dfc32b1299048bb92cdec10c4f5a25c3dbbf24d4b649624213de37beaf2f2a0d562f8eac1f5858
====================================================================================================
 30-th packet      10.113.109.133:22 -> 10.113.108.237:33862   ACK PSH          payload 112 bytes
----------------------------------------------------------------------------------------------------
15-th payloads	95cae53943bfedac4358fa81abb201760c720b40fc918efb98b251ab38ccc900e041ca848d2aac560bbef0082e9d0fa1d53adda634737f015ce2965c617d1922ab0794958635cabb8ffd95a66285f5240d628708e2f4745b4457726750159f10eec501dd058c7367d6f858c3a1b5455f
====================================================================================================
 31-th packet   10.113.108.237:33862 -> 10.113.109.133:22      ACK              payload 0 bytes
====================================================================================================
 32-th packet      10.113.109.133:22 -> 10.113.108.237:33862   ACK PSH          payload 560 bytes
----------------------------------------------------------------------------------------------------
16-th payloads	af5d894c03a5427f63c0a1c158d41ccb930fa527405804e2b931a11dd67a8f5c5deaa7ea0a096d01f04a40c4fb931ca60086d9696ea0d7aec288c15c10458b0933e28086fbe4c48eb873612d13c71649bbcbf7496ce93adef94400884a96ced59ff19921e9c7713b8a9cd6b072d8aae54919d6bae90ccb9b254d445f96bb2780118f94f95cfe02fefb44a0ec9917b99fc597333a0e04e53da9d2b1d77d4ab989037d91f0d2f1f969901ee6e5622dcc148a536768b676efcea090881c339abad5392117c2ac5f8b05b9942e59dedea0a4bd7ee62395448201a9219def2832b20d1a9c8306b5f6883a363ba1a3cfa922cd11c6115a79de085f8f459dfdb2845effd9a3c803b9d89cf4b460b9b5698f2cd8afef067e34258b02ff847053e5d494d62b5011d066c1e6f5adb139d31832ea876f69e1a5a60a97b984413cfeacf2b58ccedc77d4e1846bbe2336b4255e2d45326bf7779a2217ef763d4140d825f2847d135b5852c867eff9b669125bc3e5ec5762116a375face27de83f6091ad3362f2ca49aab933ab6d85755192e53572681c9caa3288aed212518bbf8794a2c0c564003cdcf2bed48c38bfa7d5cae378f70945df294406fc1651be7c49d40a8dea5c669eeff6e2929db4dc089b3b37a2259828c0eaeff48dcac991c0c494609e3e44ca56723bc3c4837cd867b526d275164dccf4760e332a63aa20cef38f3e39ea3b76de6bfadac6cb275f8d48c531fa2a80894a0aa5d3fb04a17d1b76ee10f42cb003efd6bb8a07c020e562fae8399e5d83
====================================================================================================
 33-th packet   10.113.108.237:33862 -> 10.113.109.133:22      ACK              payload 0 bytes
====================================================================================================
 34-th packet   10.113.108.237:33862 -> 10.113.109.133:22      ACK PSH          payload 64 bytes
----------------------------------------------------------------------------------------------------
17-th payloads	cd86a03a5d91c68d09cbc505d93a241838ad0e21e4d4404a2bf40797ed728dcc57dee09d237a9503837fa9dafeef46dc9191138847cceb62af4c1efa8a56ccee
====================================================================================================
 35-th packet      10.113.109.133:22 -> 10.113.108.237:33862   ACK PSH          payload 608 bytes
----------------------------------------------------------------------------------------------------
18-th payloads	55f67de63cdfbff7fa5efa55bc7c56b5ef3f3f7ca70b6d8aa91c0c3e34c4902dddcdb11495565cc113306a4c0e63ec1d969b6ff7290cc3d069531be27c7d4468f3820942a3e2d75491c765f26235b9434af38ee4ebafadebbca014be8bf6c7bc6ce35b2fec1253265d8ac19f93fafa9d01a0317d842f8c02ed6d45b38a3b7fb2953d4d5cc7e97d8c7275c6e1b79aff7f1c8edc356f311914abd7fa663f3af0de8afdc5c19c7508c5b1bac28c832792cd2381e72a6121e5dbdcf1dbcdb01109d29bccc75bc4bdac973ca289cb753daf5e321fa52b49ac158b6838c9a8779505aadad05d4fc85bd3a42aa4e5aff45537c674b12fa1e342d4e293411c39198c7601bdbec57dfee9065420dff6579ac329bc7cf506b5763e9e3bdd99e480990a8443b7c29bc9ae5fca108af91224bc6eda700313645b72eb2c7ae4f6bdfe23fc7e2206fab065573201af48f057701a3b42f054c9f85ff20dd2502bded7fa7a5b48a704f4b6aef54f1b9e3d37f649f8f4022b7d6e6dbfac19649b2b6c362d50ed03458df85ee9ee4220dfd32661696947a5c56e95f07768e4495490f784fbdb3f7997e4a7a2e5b686bdcc8b4d9673978eae7723907494abcabfe70c1b59446dbcbaa169447d70a8c5337638cef19ff1387ce983b3ca4552598642dd98342d18db7232092847e949937346f463814fab0be14671aa218c7a2031716483a290c65dfda591f34bbc855b4bcdc122bc851a0019ddbfdc4f3c881317b7acaa49f350618bcce241348792bddf125d620fe0359d610646ca794ca37deae0ef00e28544c0f7c5cda0708ada22f175385e143a3f0eb03be6d066491ce0b248d94936fd2fd370c6
====================================================================================================
 36-th packet   10.113.108.237:33862 -> 10.113.109.133:22      ACK              payload 0 bytes
====================================================================================================
 37-th packet   10.113.108.237:33862 -> 10.113.109.133:22      ACK PSH          payload 80 bytes
----------------------------------------------------------------------------------------------------
19-th payloads	8837d98b971b13d52db1130fbb8ea2577cc7f235488cfa5f7cfb914073b0563b4a5c22cb68eb3751ab8f95e0f8e3a3ad35ceb0e0ea7de93d32ab85e0faaf9995bdc61d93e3aac64d2213f81503d4c4c5
====================================================================================================
 38-th packet      10.113.109.133:22 -> 10.113.108.237:33862   ACK PSH          payload 128 bytes
----------------------------------------------------------------------------------------------------
20-th payloads	9a72fa7b22f02a884403fbbb98335c641158a6f7f9cc8bb19a57506629c53b122ea837f3c22f61bbab4621f8f44477c22c607aad505f3b22aae5f19e1a55e88e2b1b815a130993cb6c2002ceba6f47fc82b905dbba8cce506530f6fd460ee4068b0a9b0e7d8cb07cb18e2477449fd9779d367c58e1b1ee51723db04743954cb3
====================================================================================================
 39-th packet   10.113.108.237:33862 -> 10.113.109.133:22      ACK              payload 0 bytes
====================================================================================================
 40-th packet   10.113.108.237:33862 -> 10.113.109.133:22      ACK PSH          payload 64 bytes
----------------------------------------------------------------------------------------------------
21-th payloads	3ae10b6f9d0c8d006471c80e308c4a0facfd75db2a128b850bb8de003951f13c46fcfc2d581440f1985d0419b076d535762f670b839c249fcc0b5aa416dbe02d
====================================================================================================
 41-th packet      10.113.109.133:22 -> 10.113.108.237:33862   ACK PSH          payload 256 bytes
----------------------------------------------------------------------------------------------------
22-th payloads	f0576e16c0597d050064cde7b962bda95d81bf8d0ea0adab67b424567ec7739d95505bcac87587b862fe74b537ec17ca417cad184d96863501c62059989f24d0c4e872a66a4bdf90432e94ffff6838af64961883f6c2b7714985405774c9a546152167bd617fe9304b06ba37faf2204d41ba46223aeeda5af8d575929f2c46da3bb3f773080c5131c86a963ae85d8f403fbf80144ce71da428788dfcdcc8e51baa52d0b4e4bd77b67f220188c64b1476ed6c30bd3ed65893744361eda12531e2361d17bab29f9fb080b06fc97346dda2aa5fcb261243f1c2665b5a10d9fc0188e40d96a59c671b297254b238f34172503d1d37b20ceb8bb33fc5d602f1b8d24e
====================================================================================================
 42-th packet   10.113.108.237:33862 -> 10.113.109.133:22      ACK              payload 0 bytes
====================================================================================================
 43-th packet   10.113.108.237:33862 -> 10.113.109.133:22      ACK PSH          payload 64 bytes
----------------------------------------------------------------------------------------------------
23-th payloads	f6e464699d12b69b30bc38b89876fb06f4c65f6ec5f43adf2d3e4b01c06f409c61417cb4fa3fb964d019cba397137dae46b1ffa24a5c2a7f5afb9dab081dd598
====================================================================================================
 44-th packet      10.113.109.133:22 -> 10.113.108.237:33862   ACK              payload 0 bytes
====================================================================================================
 45-th packet   10.113.108.237:33862 -> 10.113.109.133:22      ACK PSH          payload 80 bytes
----------------------------------------------------------------------------------------------------
24-th payloads	2578fe65c8217ad67aac7980aa2b7229827e826e1ca3c0957319c48985d7919e54f3951828cd45ff9fd09079f35db3143497d386710cbef47a250aa68f0994c682dc1c048cfe4d719c1862495c16804d
====================================================================================================
 46-th packet      10.113.109.133:22 -> 10.113.108.237:33862   ACK              payload 0 bytes
====================================================================================================
 47-th packet      10.113.109.133:22 -> 10.113.108.237:33862   ACK FIN          payload 0 bytes
====================================================================================================
 48-th packet   10.113.108.237:33862 -> 10.113.109.133:22      ACK              payload 0 bytes
====================================================================================================
 49-th packet   10.113.108.237:33862 -> 10.113.109.133:22      ACK FIN          payload 0 bytes
====================================================================================================
 50-th packet      10.113.109.133:22 -> 10.113.108.237:33862   ACK              payload 0 bytes
25

Step 1: Version String

In [8]:
version_string_from_server = payloads[0].split(b"\r\n")[0]
print(version_string_from_server.decode())

version_string_from_client = payloads[1].split(b"\r\n")[0]
print(version_string_from_client.decode())
SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3
SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.8

Step 2: Cryptographic Algorithm Negotiation

  • server random: b'\x16\x18\xf5\x9c\x01}\\x1a\x82\n\xb1.%\xc9\x0e\xc7'
  • client random: b'0123456789abcdef'
  • key exchange algorithm: ecdh-sha2-nistp256
  • server public key algorithm: ecdsa-sha2-nistp256
  • encryption algorithm: aes128-ctr
  • MAC algorithm: hmac-sha2-256
  • compression: None
In [9]:
ssh_payload_key_init_from_server = Unpack(SSH_PACKET, payloads[2])["payload"]
key_init_from_server = Unpack(SSH_MSG_KEXINIT, ssh_payload_key_init_from_server)
ShowDict(key_init_from_server)
message_type                    : SSH_MSG_KEXINIT
cookie                          : b'\x16\x18\xf5\x9c\x01}\\\x1a\x82\n\xb1.%\xc9\x0e\xc7'
kex_algorithms_length           : 258
kex_algorithms                  : curve25519-sha256,curve25519-sha256@libssh.org,ecdh-sha2-nistp25...
server_host_key_algorithms_length: 65
server_host_key_algorithms      : ssh-rsa,rsa-sha2-512,rsa-sha2-256,ecdsa-sha2-nistp256,ssh-ed2551...
encryption_algorithms_client_to_server_length: 108
encryption_algorithms_client_to_server: chacha20-poly1305@openssh.com,aes128-ctr,aes192-ctr,aes256-ctr,a...
encryption_algorithms_server_to_client_length: 108
encryption_algorithms_server_to_client: chacha20-poly1305@openssh.com,aes128-ctr,aes192-ctr,aes256-ctr,a...
mac_algorithms_client_to_server_length: 213
mac_algorithms_client_to_server : umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256-e...
mac_algorithms_server_to_client_length: 213
mac_algorithms_server_to_client : umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256-e...
compression_algorithms_client_to_server_length: 21
compression_algorithms_client_to_server: none,zlib@openssh.com
compression_algorithms_server_to_client_length: 21
compression_algorithms_server_to_client: none,zlib@openssh.com
languages_client_to_server_length: 0
languages_client_to_server      : None
languages_server_to_client_length: 0
languages_server_to_client      : None
guessed_packet_will_be_sent     : False
reserved                        : 0
In [10]:
ssh_payload_key_init_from_client = Unpack(SSH_PACKET, payloads[3])["payload"]
key_init_from_client = Unpack(SSH_MSG_KEXINIT, ssh_payload_key_init_from_client)
ShowDict(key_init_from_client)
message_type                    : SSH_MSG_KEXINIT
cookie                          : b'0123456789abcdef'
kex_algorithms_length           : 18
kex_algorithms                  : ecdh-sha2-nistp256
server_host_key_algorithms_length: 19
server_host_key_algorithms      : ecdsa-sha2-nistp256
encryption_algorithms_client_to_server_length: 10
encryption_algorithms_client_to_server: aes128-ctr
encryption_algorithms_server_to_client_length: 10
encryption_algorithms_server_to_client: aes128-ctr
mac_algorithms_client_to_server_length: 13
mac_algorithms_client_to_server : hmac-sha2-256
mac_algorithms_server_to_client_length: 13
mac_algorithms_server_to_client : hmac-sha2-256
compression_algorithms_client_to_server_length: 26
compression_algorithms_client_to_server: none,zlib@openssh.com,zlib
compression_algorithms_server_to_client_length: 26
compression_algorithms_server_to_client: none,zlib@openssh.com,zlib
languages_client_to_server_length: 0
languages_client_to_server      : None
languages_server_to_client_length: 0
languages_server_to_client      : None
guessed_packet_will_be_sent     : False
reserved                        : 0

Step 3: Key Exchange

  • NIST Curve P256 base point $$G = (48439561293906451759052585252797914202762949526041747995844080717082404635286, 36134250956749795798585127919587881956611106672985015071877198253568414405109)$$

  • client's public point $$A = a*G = (48439561293906451759052585252797914202762949526041747995844080717082404635286, 36134250956749795798585127919587881956611106672985015071877198253568414405109)$$

$$A = G$$
  • server's public point $$B = b*G = (21864520783665454855002022074010285730585032824798206675619652682902836405360, 63996104614066925323831115738336842583805177542348603620328310495655730595671)$$

  • We know that the client's secret multiplier $a = 1$ and so the shared secret point $$C = ab*G = B$$

In [11]:
curve_param = ECDSA_PARAM["NIST_Curve_P256"]
EC = EllipticCurve(*curve_param[0:3])
G = tuple(curve_param[3:5])
EC.AssertPoint(G)
print(G)
(48439561293906451759052585252797914202762949526041747995844080717082404635286, 36134250956749795798585127919587881956611106672985015071877198253568414405109)
In [12]:
ssh_payload = Unpack(SSH_PACKET, payloads[4])["payload"]
key_exchange_from_client = Unpack(SSH_MSG_KEXDH_INIT, ssh_payload)
ShowDict(key_exchange_from_client)
A = BytesToECPoint(key_exchange_from_client["e"].to_bytes(65, "big"))
print(A)
message_type                    : SSH_MSG_KEX_ECDH_INIT
e_length                        : 65
e                               : 59240149723730851812311272008153533141816437726696305166080887910572446982458012615605924465554721774228350039774385670824392793454808075284049927019123189
(48439561293906451759052585252797914202762949526041747995844080717082404635286, 36134250956749795798585127919587881956611106672985015071877198253568414405109)
In [13]:
i = 0
(i, result0) = UnpackPartial(SSH_PACKET, payloads[5], i)
key_exchange_from_server = Unpack(SSH_MSG_KEXDH_REPLY, result0["payload"])
ShowDict(key_exchange_from_server)
print("-"*120)
(i, result1) = UnpackPartial(SSH_PACKET, payloads[5], i)
newkeys_from_server = Unpack(SSH_MSG_KEXDH_REPLY, result1["payload"])
ShowDict(newkeys_from_server)
message_type                    : SSH_MSG_KEX_ECDH_REPLY
host_key_length                 : 104
host_key
    algorithm_length                : 19
    algorithm                       : ecdsa-sha2-nistp256
    curve_id_length                 : 8
    curve_id                        : nistp256
    pub_key_length                  : 65
    pub_key                         : b'\x04\x16\xe8\xab=DP3\x02+\x13\x82!l\xed\x10\x8de,\xa7\xe1\x97\x1ct\xbd\x94\xa7\x06\x139\x82\xd9\xe7p\xf2#\xbbA\xd1\xb5\x16H\xa2\xaf\xc3\xf9,,\xee\xcc\x1d\x17\x90c\xc2%\xf9\xcf{\xde\xb7w@a'...
f_length                        : 65
f                               : 56162970261483733380231056732210610263289555397304801731247312456577073838195811196444206643079983304869996048048379276845489587978501156563849741095389015
signature_length                : 100
signature
    algorithm_length                : 19
    algorithm                       : ecdsa-sha2-nistp256
    signature_length                : 73
    signature
        r_length                        : 32
        r                               : 56464302082696653113080941758970011928480078470168585675464317408468272970139
        s_length                        : 33
        s                               : 80387071089785870534444841232924646925520332061016813956066094423439622086840
------------------------------------------------------------------------------------------------------------------------
message_type                    : SSH_MSG_NEWKEYS
In [14]:
ssh_payload = Unpack(SSH_PACKET, payloads[6])["payload"]
newkeys_from_client = Unpack(SSH_MSG_NEWKEYS, ssh_payload)
ShowDict(newkeys_from_client)
message_type                    : SSH_MSG_NEWKEYS

Step 4: Signature Verification

In [15]:
B = BytesToECPoint(key_exchange_from_server["f"].to_bytes(65, "big"))
print(B)

#the shared secret is the x-coordinate of the shared point
shared_secret = B[0].to_bytes(32, "big")
print(len(shared_secret), shared_secret)
(21864520783665454855002022074010285730585032824798206675619652682902836405360, 63996104614066925323831115738336842583805177542348603620328310495655730595671)
32 b'0V\xe1U\xb9\xdeR\xd6[\xad\x8c\xf1u\x17\xb1\xf0\xbdF?D\xad\x1f\xebtC\xfd\xc9\xa4\xdb4\xe4p'
In [16]:
server_host_key = b"\x00\x00\x00\x13ecdsa-sha2-nistp256\x00\x00\x00\x08nistp256\x00\x00\x00A\x04\x16\xe8\xab=DP3\x02+\x13\x82!l\xed\x10\x8de,\xa7\xe1\x97\x1ct\xbd\x94\xa7\x06\x139\x82\xd9\xe7p\xf2#\xbbA\xd1\xb5\x16H\xa2\xaf\xc3\xf9,,\xee\xcc\x1d\x17\x90c\xc2%\xf9\xcf{\xde\xb7w@a\x86"
client_kex_pub = key_exchange_from_client["e"].to_bytes(65, "big")
server_kex_pub = key_exchange_from_server["f"].to_bytes(65, "big")

message = bytes()
message += len(version_string_from_client).to_bytes(4, "big") + version_string_from_client
message += len(version_string_from_server).to_bytes(4, "big") + version_string_from_server
message += len(ssh_payload_key_init_from_client).to_bytes(4, "big") + ssh_payload_key_init_from_client
message += len(ssh_payload_key_init_from_server).to_bytes(4, "big") + ssh_payload_key_init_from_server
message += len(server_host_key).to_bytes(4, "big") + server_host_key
message += len(client_kex_pub).to_bytes(4, "big") + client_kex_pub
message += len(server_kex_pub).to_bytes(4, "big") + server_kex_pub
message += len(shared_secret).to_bytes(4, "big") + shared_secret
#print(len(message), message)
exchange_hash = hashlib.new("sha256", message).digest()
print(exchange_hash)
b'n\xe9\x042\x8c\xa4!\x1e\xaeC"W\xa3q\xe4\xee\xbb\x83\xab\xb6\xed\xc9(\x98\xf3h\xbb\xb7\x8e\xe4nx'
In [17]:
public_key = BytesToECPoint(key_exchange_from_server["host_key"]["pub_key"])
print(public_key)
r = key_exchange_from_server["signature"]["signature"]["r"]
s = key_exchange_from_server["signature"]["signature"]["s"]
signature = (r, s)
print(signature)
ecdsa = ECDSA("NIST_Curve_P256", "sha256")
assert ecdsa.Verify(public_key, exchange_hash, signature)
(10361973038236721483332134316072195193951886831387801385795849800499897489895, 51086862640565936499713182104599332416370389771831684999864329304603313070470)
(56464302082696653113080941758970011928480078470168585675464317408468272970139, 80387071089785870534444841232924646925520332061016813956066094423439622086840)

Step 5: Key Derivation

In [18]:
#AES-128-CTR
enc_iv_length = 16
enc_key_length = 16
enc_block_length = 16
#HMAC-SHA256
mac_length = 32
mac_key_length = 32
hash_algo = "sha256"
session_id = exchange_hash
client_iv = hashlib.new(hash_algo, len(shared_secret).to_bytes(4, "big") + shared_secret + exchange_hash + b"A" + session_id).digest()[:enc_iv_length]
client_enc_key = hashlib.new(hash_algo, len(shared_secret).to_bytes(4, "big") + shared_secret + exchange_hash + b"C" + session_id).digest()[:enc_key_length]
client_mac_key = hashlib.new(hash_algo, len(shared_secret).to_bytes(4, "big") + shared_secret + exchange_hash + b"E" + session_id).digest()[:mac_key_length]
server_iv = hashlib.new(hash_algo, len(shared_secret).to_bytes(4, "big") + shared_secret + exchange_hash + b"B" + session_id).digest()[:enc_iv_length]
server_enc_key = hashlib.new(hash_algo, len(shared_secret).to_bytes(4, "big") + shared_secret + exchange_hash + b"D" + session_id).digest()[:enc_key_length]
server_mac_key = hashlib.new(hash_algo, len(shared_secret).to_bytes(4, "big") + shared_secret + exchange_hash + b"F" + session_id).digest()[:mac_key_length]
client_keys = (client_iv, client_enc_key, client_mac_key)
server_keys = (server_iv, server_enc_key, server_mac_key)
server_sequence = 3
server_counter = 0
client_sequence = 3
client_counter = 0
print(client_keys)
print(server_keys)
(b'x\x8bH\xa7\x9f*`\xef\xa0\x0b\xfe\x94\x00\xaa\xf53', b'\x11\x10-\xa6\x87c/ngZ\xc6Pn\xb7\xa5B', b'\xdf\xfb\xda3\x12\xab\xf5\xb6p7\xb8\x0c2q~\xc3\xe6\xb4X\x03\xab\x87\xd1y\x0fQ\xc3\xd6\xe8\xf6o\xbd')
(b'\x92j\xc3\xa7\xce\xddO\x96\xd9\xee\x92\x8a\xd3\x9d:\xf8', b']:\xb2\xbd\x05\xaf\xe2\x93\xb96D\xcfr\x03{\xfe', b"\xad\xf0F2\x18x\x08\x9d\x12\xbeQ\xe4X\xb8L\x85P\xfa^\xf0\xd0\x9az\xeb\x00'\x89\xaf\x9bU4\xfa")

Step 6: Service Request

In [19]:
encrypted_payload = payloads[7]

print("="*120)
print(client_sequence, client_counter)

ct = encrypted_payload[:-mac_length]
mac = encrypted_payload[-mac_length:]
iv = int.from_bytes(client_keys[0], "big") + client_counter
pt = AES_CTR(client_keys[1], iv, ct)
assert mac == HMAC_Generate(client_keys[2], client_sequence, pt, hash_algo)
client_sequence += 1
client_counter += len(pt)//enc_block_length
print(pt)

ssh_payload = Unpack(SSH_PACKET, pt)["payload"]
message_from_client = Unpack(SSH_MSG_SERVICE_REQUEST, ssh_payload)
ShowDict(message_from_client)


##############################################################################

encrypted_payload = payloads[8]

print("="*120)
print(server_sequence, server_counter)

ct = encrypted_payload[:-mac_length]
mac = encrypted_payload[-mac_length:]
iv = int.from_bytes(server_keys[0], "big") + server_counter
pt = AES_CTR(server_keys[1], iv, ct)
assert mac == HMAC_Generate(server_keys[2], server_sequence, pt, hash_algo)
server_sequence += 1
server_counter += len(pt)//enc_block_length
print(pt)

ssh_payload = Unpack(SSH_PACKET, pt)["payload"]
message_from_server = Unpack(SSH_MSG_USERAUTH_REQUEST, ssh_payload)
ShowDict(message_from_server)
========================================================================================================================
3 0
b'\x00\x00\x00\x1c\n\x05\x00\x00\x00\x0cssh-userauth\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
message_type                    : SSH_MSG_SERVICE_REQUEST
service_name_length             : 12
service_name                    : ssh-userauth
========================================================================================================================
3 0
b'\x00\x00\x00\x1c\n\x06\x00\x00\x00\x0cssh-userauthD\'\x0f}"\xf5z\x8a63'
message_type                    : SSH_MSG_SERVICE_ACCEPT
user_name_length                : 12
user_name                       : b'ssh-userauth'

Step 7: UserAuth and Global Request

In [20]:
print("="*120)
print(client_sequence, client_counter)
encrypted_payload = payloads[9]

ct = encrypted_payload[:-mac_length]
mac = encrypted_payload[-mac_length:]
iv = int.from_bytes(client_keys[0], "big") + client_counter
pt = AES_CTR(client_keys[1], iv, ct)
assert mac == HMAC_Generate(client_keys[2], client_sequence, pt, hash_algo)
client_sequence += 1
client_counter += len(pt)//enc_block_length
print(pt)

ssh_payload = Unpack(SSH_PACKET, pt)["payload"]
message_from_client = Unpack(SSH_MSG_USERAUTH_REQUEST, ssh_payload)
ShowDict(message_from_client)

##############################################################################

encrypted_payload = payloads[10]

print("="*120)
print(server_sequence, server_counter)

ct = encrypted_payload[:-mac_length]
mac = encrypted_payload[-mac_length:]
iv = int.from_bytes(server_keys[0], "big") + server_counter
pt = AES_CTR(server_keys[1], iv, ct)
assert mac == HMAC_Generate(server_keys[2], server_sequence, pt, hash_algo)
server_sequence += 1
server_counter += len(pt)//enc_block_length
print(pt)

ssh_payload = Unpack(SSH_PACKET, pt)["payload"]
message_from_server = Unpack(SSH_MSG_USERAUTH_SUCCESS, ssh_payload)
ShowDict(message_from_server)


encrypted_payload = payloads[11]

print("="*120)
print(server_sequence, server_counter)

ct = encrypted_payload[:-mac_length]
mac = encrypted_payload[-mac_length:]
iv = int.from_bytes(server_keys[0], "big") + server_counter
pt = AES_CTR(server_keys[1], iv, ct)
assert mac == HMAC_Generate(server_keys[2], server_sequence, pt, hash_algo)
server_sequence += 1
server_counter += len(pt)//enc_block_length
print(pt)

ssh_payload = Unpack(SSH_PACKET, pt)["payload"]
message_from_server = Unpack(SSH_MSG_GLOBAL_REQUEST, ssh_payload)
ShowDict(message_from_server)
========================================================================================================================
4 2
b'\x00\x00\x00L\x162\x00\x00\x00\x05guest\x00\x00\x00\x0essh-connection\x00\x00\x00\x08password\x00\x00\x00\x00\x08p@ssw0rd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
message_type                    : SSH_MSG_USERAUTH_REQUEST
user_name_length                : 5
user_name                       : b'guest'
service_name_length             : 14
service_name                    : ssh-connection
method_name_length              : 8
method_name                     : password
reserved                        : False
data_length                     : 8
data                            : b'p@ssw0rd'
========================================================================================================================
4 2
b'\x00\x00\x00\x0c\n4\x1b\xa9\xb3\xd5j\x8f\x8a\xae\x86u'
message_type                    : SSH_MSG_USERAUTH_SUCCESS
========================================================================================================================
5 3
b'\x00\x00\x01\xec\x10P\x00\x00\x00\x17hostkeys-00@openssh.com\x00\x00\x00\x01\x17\x00\x00\x00\x07ssh-rsa\x00\x00\x00\x03\x01\x00\x01\x00\x00\x01\x01\x00\xc8\xe6f\x01\x81m\x1a\xa5\x82\xe0\x8e\xde\x13\xb3\t\xf4t\xb7\x9a\x1a\xeb\xb5h{\xbd\x88d\xce\x93\x06\xc6)yf3\xff\x08w\xb8<\xc3o\xb4\xf3\\\xa4\xf5\xb5\xbe\xea\xb6\xb2\xeb\xa6\xf0\xc5\x1c4r0\xac\xb81\xba\xad7k\x15PWI;\x86O?95g/U=\xa6\xaf\xa6\xeaa\x9d\x93zP7\x17\xd3\xb3\xff\x8d\xe77\xe6u\xc5\x84N\xaa\xc7\x0b":\x9a\xcapw\x02+B\x06}z$\xa9\x0f\xc0P\xd4%\xb7\xbcV\rtlU\xe6\xac\x86/D\xd9hy\x85\x0bB.{.\xf7\xa9\xd3@\x1b,\xda\xd2B\xf4\xd7\xca\xf1y\xed\x16\xb1}\xe7\xd4\xfdZ\xcf\xfa\xb3)J<8T/\x0e\x05\xca\xc4\xed\x84\x94\xd9!\x1bJ\x8f\x190<\xd4\xcb\xd4L\x80\x07\x82\xe7\xf4\r\xf6\xb3[\xc3<\xae\x0e\xf7\xfdN]/{\xea\x0e\x08]\xfc\xd9d\xb4>\xcaw\xd5\xc7\xb9\xc9\xcbz\xcc\x1a\xf0\xd7\xa5\x04KIH\x9c\x07\xd6\xb6\xf2\x03&\x80\xa2XG\x91\x18\xbeQ\x00\x00\x00h\x00\x00\x00\x13ecdsa-sha2-nistp256\x00\x00\x00\x08nistp256\x00\x00\x00A\x04\x16\xe8\xab=DP3\x02+\x13\x82!l\xed\x10\x8de,\xa7\xe1\x97\x1ct\xbd\x94\xa7\x06\x139\x82\xd9\xe7p\xf2#\xbbA\xd1\xb5\x16H\xa2\xaf\xc3\xf9,,\xee\xcc\x1d\x17\x90c\xc2%\xf9\xcf{\xde\xb7w@a\x86\x00\x00\x003\x00\x00\x00\x0bssh-ed25519\x00\x00\x00 Sl\x81\xf9wN\xca\x84t\xe1<\xd0\r\x9d\xd7\xf2\x0f\xb0\x90\xd7yBj\x8d\xbe\x03\x9aS\xf1\x93P\xe4\x1e\x97u\x95\x86g\x8b_\xfb4\x08\xf2\xe2\xc9\xbeB'
message_type                    : SSH_MSG_GLOBAL_REQUEST
request_name_length             : 23
request_name                    : hostkeys-00@openssh.com
want_reply                      : False
data                            : b'\x00\x00\x01\x17\x00\x00\x00\x07ssh-rsa\x00\x00\x00\x03\x01\x00\x01\x00\x00\x01\x01\x00\xc8\xe6f\x01\x81m\x1a\xa5\x82\xe0\x8e\xde\x13\xb3\t\xf4t\xb7\x9a\x1a\xeb\xb5h{\xbd\x88d\xce\x93\x06\xc6)yf3\xff\x08'...

Step 8: Channel Open

In [21]:
encrypted_payload = payloads[12]

print("="*120)
print(client_sequence, client_counter)

ct = encrypted_payload[:-mac_length]
mac = encrypted_payload[-mac_length:]
iv = int.from_bytes(client_keys[0], "big") + client_counter
pt = AES_CTR(client_keys[1], iv, ct)
assert mac == HMAC_Generate(client_keys[2], client_sequence, pt, hash_algo)
client_sequence += 1
client_counter += len(pt)//enc_block_length
print(pt)

ssh_payload = Unpack(SSH_PACKET, pt)["payload"]
message_from_client = Unpack(SSH_MSG_CHANNEL_OPEN, ssh_payload)
ShowDict(message_from_client)

##############################################################################

encrypted_payload = payloads[13]

print("="*120)
print(server_sequence, server_counter)

ct = encrypted_payload[:-mac_length]
mac = encrypted_payload[-mac_length:]
iv = int.from_bytes(server_keys[0], "big") + server_counter
pt = AES_CTR(server_keys[1], iv, ct)
assert mac == HMAC_Generate(server_keys[2], server_sequence, pt, hash_algo)
server_sequence += 1
server_counter += len(pt)//enc_block_length
print(pt)

ssh_payload = Unpack(SSH_PACKET, pt)["payload"]
message_from_server = Unpack(SSH_MSG_CHANNEL_OPEN_CONFIRMATION, ssh_payload)
ShowDict(message_from_server)
========================================================================================================================
5 7
b'\x00\x00\x00,\x13Z\x00\x00\x00\x07session\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
message_type                    : SSH_MSG_CHANNEL_OPEN
channel_type_length             : 7
channel_type                    : session
sender_channel                  : 0
initial_window_size             : 1048576
maximum_packet_size             : 16384
========================================================================================================================
6 34
b'\x00\x00\x00\x1c\n[\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x11\xaa,\xbe\xe9\x0e\xec\x90nJ'
message_type                    : SSH_MSG_CHANNEL_OPEN_CONFIRMATION
recipient_channel               : 0
sender_channel                  : 0
initial_window_size             : 0
maximum_packet_size             : 32768

Step 9: Channel Request

In [22]:
encrypted_payload = payloads[14]

print("="*120)
print(client_sequence, client_counter)

ct = encrypted_payload[:-mac_length]
mac = encrypted_payload[-mac_length:]
iv = int.from_bytes(client_keys[0], "big") + client_counter
pt = AES_CTR(client_keys[1], iv, ct)
assert mac == HMAC_Generate(client_keys[2], client_sequence, pt, hash_algo)
client_sequence += 1
client_counter += len(pt)//enc_block_length
print(pt)

ssh_payload = Unpack(SSH_PACKET, pt)["payload"]
message_from_client = Unpack(SSH_MSG_CHANNEL_OPEN, ssh_payload)
ShowDict(message_from_client)

##############################################################################

encrypted_payload = payloads[15]

print("="*120)
print(server_sequence, server_counter)

ct = encrypted_payload[0:32]
mac = encrypted_payload[32:64]
#ct = encrypted_payload[:-mac_length]
#mac = encrypted_payload[-mac_length:]
iv = int.from_bytes(server_keys[0], "big") + server_counter
pt = AES_CTR(server_keys[1], iv, ct)
print(pt)
assert mac == HMAC_Generate(server_keys[2], server_sequence, pt, hash_algo)
server_sequence += 1
server_counter += len(pt)//enc_block_length
#print(pt)

ssh_payload = Unpack(SSH_PACKET, pt)["payload"]
message_from_server = Unpack(SSH_MSG_CHANNEL_WINDOW_ADJUST, ssh_payload)
#message_from_server = Unpack(SSH_MSG_CHANNEL_OPEN_CONFIRMATION, ssh_payload)
ShowDict(message_from_server)

print("="*120)
print(server_sequence, server_counter)

ct = encrypted_payload[64:80]
mac = encrypted_payload[80:112]
#ct = encrypted_payload[:-mac_length]
#mac = encrypted_payload[-mac_length:]
iv = int.from_bytes(server_keys[0], "big") + server_counter
pt = AES_CTR(server_keys[1], iv, ct)
print(pt)
assert mac == HMAC_Generate(server_keys[2], server_sequence, pt, hash_algo)
server_sequence += 1
server_counter += len(pt)//enc_block_length
#print(pt)

ssh_payload = Unpack(SSH_PACKET, pt)["payload"]
#message_from_server = Unpack(SSH_MSG_CHANNEL_WINDOW_ADJUST, ssh_payload)
message_from_server = Unpack(SSH_MSG_CHANNEL_OPEN_CONFIRMATION, ssh_payload)
ShowDict(message_from_server)
========================================================================================================================
6 10
b'\x00\x00\x00\x1c\x0cb\x00\x00\x00\x00\x00\x00\x00\x05shell\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
message_type                    : SSH_MSG_CHANNEL_REQUEST
channel_type_length             : 0
channel_type                    : None
sender_channel                  : 5
initial_window_size             : 1936221548
maximum_packet_size             : 27649
========================================================================================================================
7 36
b'\x00\x00\x00\x1c\x12]\x00\x00\x00\x00\x00 \x00\x00cFh\xa5\x85b\x07\xe5\xc2c\xf1c\x0e\x84\x08\x08_\xac'
message_type                    : SSH_MSG_CHANNEL_WINDOW_ADJUST
recipient_channel               : 0
bytes_to_add                    : 2097152
========================================================================================================================
8 38
b'\x00\x00\x00\x0c\x06c\x00\x00\x00\x00\xb1\xafheB\xab'
message_type                    : SSH_MSG_CHANNEL_SUCCESS
recipient_channel               : 0
In [23]:
encrypted_payload = payloads[16]

print("="*120)
print(server_sequence, server_counter)

ct = encrypted_payload[:-mac_length]
mac = encrypted_payload[-mac_length:]
iv = int.from_bytes(server_keys[0], "big") + server_counter
pt = AES_CTR(server_keys[1], iv, ct)

assert mac == HMAC_Generate(server_keys[2], server_sequence, pt, hash_algo)
server_sequence += 1
server_counter += len(pt)//enc_block_length
print(pt)

ssh_payload = Unpack(SSH_PACKET, pt)["payload"]
message_from_server = Unpack(SSH_MSG_CHANNEL_DATA, ssh_payload)
ShowDict(message_from_server)
print("-"*120)
print(message_from_server["data"].decode())
========================================================================================================================
9 39
b'\x00\x00\x02\x0c\x10^\x00\x00\x00\x00\x00\x00\x01\xf2Welcome to Ubuntu 18.04.4 LTS (GNU/Linux 5.3.0-62-generic x86_64)\n\n * Documentation:  https://help.ubuntu.com\n * Management:     https://landscape.canonical.com\n * Support:        https://ubuntu.com/advantage\n\n\n * Canonical Livepatch is available for installation.\n   - Reduce system reboots and improve kernel security. Activate at:\n     https://ubuntu.com/livepatch\n\n17 packages can be updated.\n0 updates are security updates.\n\nYour Hardware Enablement Stack (HWE) is supported until April 2023.\nA\xa5=\x05\x12\x7f\x87\x07El\xf2\x1e\xa44|\xca'
message_type                    : SSH_MSG_CHANNEL_DATA
recipient_channel               : 0
data_length                     : 498
data                            : b'Welcome to Ubuntu 18.04.4 LTS (GNU/Linux 5.3.0-62-generic x86_64'...
------------------------------------------------------------------------------------------------------------------------
Welcome to Ubuntu 18.04.4 LTS (GNU/Linux 5.3.0-62-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage


 * Canonical Livepatch is available for installation.
   - Reduce system reboots and improve kernel security. Activate at:
     https://ubuntu.com/livepatch

17 packages can be updated.
0 updates are security updates.

Your Hardware Enablement Stack (HWE) is supported until April 2023.

Step 9: Channel Data

In [24]:
encrypted_payload = payloads[17]

print("="*120)
print(client_sequence, client_counter)

ct = encrypted_payload[:-mac_length]
mac = encrypted_payload[-mac_length:]
iv = int.from_bytes(client_keys[0], "big") + client_counter
pt = AES_CTR(client_keys[1], iv, ct)
assert mac == HMAC_Generate(client_keys[2], client_sequence, pt, hash_algo)
client_sequence += 1
client_counter += len(pt)//enc_block_length
print(pt)

ssh_payload = Unpack(SSH_PACKET, pt)["payload"]
message_from_client = Unpack(SSH_MSG_CHANNEL_DATA, ssh_payload)
ShowDict(message_from_client)
print("-"*120)
print(message_from_client["data"].decode())

##############################################################################

encrypted_payload = payloads[18]

print("="*120)
print(server_sequence, server_counter)

ct = encrypted_payload[:-mac_length]
mac = encrypted_payload[-mac_length:]
iv = int.from_bytes(server_keys[0], "big") + server_counter
pt = AES_CTR(server_keys[1], iv, ct)
assert mac == HMAC_Generate(server_keys[2], server_sequence, pt, hash_algo)
server_sequence += 1
server_counter += len(pt)//enc_block_length
print(pt)

ssh_payload = Unpack(SSH_PACKET, pt)["payload"]
message_from_server = Unpack(SSH_MSG_CHANNEL_DATA, ssh_payload)
ShowDict(message_from_server)
print("-"*120)
print(message_from_server["data"].decode())
========================================================================================================================
7 12
b'\x00\x00\x00\x1c\x0b^\x00\x00\x00\x00\x00\x00\x00\x07ls -al\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
message_type                    : SSH_MSG_CHANNEL_DATA
recipient_channel               : 0
data_length                     : 7
data                            : b'ls -al\n'
------------------------------------------------------------------------------------------------------------------------
ls -al

========================================================================================================================
10 72
b'\x00\x00\x02<\x0e^\x00\x00\x00\x00\x00\x00\x02$total 48\ndrwxr-xr-x 4 guest guest 4096  7\xec\x9b\x94 20 22:45 .\ndrwxr-xr-x 4 root  root  4096  7\xec\x9b\x94 20 22:36 ..\n-rw------- 1 guest guest   25  7\xec\x9b\x94 20 22:45 .bash_history\n-rw-r--r-- 1 guest guest  220  4\xec\x9b\x94  5  2018 .bash_logout\n-rw-r--r-- 1 guest guest 3771  4\xec\x9b\x94  5  2018 .bashrc\ndrwx------ 2 guest guest 4096  7\xec\x9b\x94 20 22:45 .cache\n-rw-r--r-- 1 guest guest 8980  4\xec\x9b\x94 16  2018 examples.desktop\n-rw-rw-r-- 1 guest guest   77  7\xec\x9b\x94 20 22:43 flag.txt\ndrwx------ 3 guest guest 4096  7\xec\x9b\x94 20 22:40 .gnupg\n-rw-r--r-- 1 guest guest  807  4\xec\x9b\x94  5  2018 .profile\n\x9b\xee3\xde2\xee\xf6\x88I\x86YbE\xb3'
message_type                    : SSH_MSG_CHANNEL_DATA
recipient_channel               : 0
data_length                     : 548
data                            : b'total 48\ndrwxr-xr-x 4 guest guest 4096  7\xec\x9b\x94 20 22:45 .\ndrwxr-xr'...
------------------------------------------------------------------------------------------------------------------------
total 48
drwxr-xr-x 4 guest guest 4096  7월 20 22:45 .
drwxr-xr-x 4 root  root  4096  7월 20 22:36 ..
-rw------- 1 guest guest   25  7월 20 22:45 .bash_history
-rw-r--r-- 1 guest guest  220  4월  5  2018 .bash_logout
-rw-r--r-- 1 guest guest 3771  4월  5  2018 .bashrc
drwx------ 2 guest guest 4096  7월 20 22:45 .cache
-rw-r--r-- 1 guest guest 8980  4월 16  2018 examples.desktop
-rw-rw-r-- 1 guest guest   77  7월 20 22:43 flag.txt
drwx------ 3 guest guest 4096  7월 20 22:40 .gnupg
-rw-r--r-- 1 guest guest  807  4월  5  2018 .profile

In [25]:
encrypted_payload = payloads[19]

print("="*120)
print(client_sequence, client_counter)

ct = encrypted_payload[:-mac_length]
mac = encrypted_payload[-mac_length:]
iv = int.from_bytes(client_keys[0], "big") + client_counter
pt = AES_CTR(client_keys[1], iv, ct)
assert mac == HMAC_Generate(client_keys[2], client_sequence, pt, hash_algo)
client_sequence += 1
client_counter += len(pt)//enc_block_length
print(pt)

ssh_payload = Unpack(SSH_PACKET, pt)["payload"]
message_from_client = Unpack(SSH_MSG_CHANNEL_DATA, ssh_payload)
ShowDict(message_from_client)
print("-"*120)
print(message_from_client["data"].decode())

##############################################################################

encrypted_payload = payloads[20]

print("="*120)
print(server_sequence, server_counter)

ct = encrypted_payload[:-mac_length]
mac = encrypted_payload[-mac_length:]
iv = int.from_bytes(server_keys[0], "big") + server_counter
pt = AES_CTR(server_keys[1], iv, ct)
assert mac == HMAC_Generate(server_keys[2], server_sequence, pt, hash_algo)
server_sequence += 1
server_counter += len(pt)//enc_block_length
print(pt)

ssh_payload = Unpack(SSH_PACKET, pt)["payload"]
message_from_server = Unpack(SSH_MSG_CHANNEL_DATA, ssh_payload)
ShowDict(message_from_server)
print("-"*120)
print(message_from_server["data"].decode())
========================================================================================================================
8 14
b'\x00\x00\x00,\x15^\x00\x00\x00\x00\x00\x00\x00\rcat flag.txt\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
message_type                    : SSH_MSG_CHANNEL_DATA
recipient_channel               : 0
data_length                     : 13
data                            : b'cat flag.txt\n'
------------------------------------------------------------------------------------------------------------------------
cat flag.txt

========================================================================================================================
11 108
b'\x00\x00\x00\\\x05^\x00\x00\x00\x00\x00\x00\x00MSCTF{RFC-4253:_The_Secure_Shell_(SSH)_Transport_Layer_Protocol_January_2006}\n\x91I\x1e\x14\x03'
message_type                    : SSH_MSG_CHANNEL_DATA
recipient_channel               : 0
data_length                     : 77
data                            : b'SCTF{RFC-4253:_The_Secure_Shell_(SSH)_Transport_Layer_Protocol_J'...
------------------------------------------------------------------------------------------------------------------------
SCTF{RFC-4253:_The_Secure_Shell_(SSH)_Transport_Layer_Protocol_January_2006}

Step 10: Close channel and disconnect

In [26]:
encrypted_payload = payloads[21]

print("="*120)
print(client_sequence, client_counter)

ct = encrypted_payload[:-mac_length]
mac = encrypted_payload[-mac_length:]
iv = int.from_bytes(client_keys[0], "big") + client_counter
pt = AES_CTR(client_keys[1], iv, ct)
assert mac == HMAC_Generate(client_keys[2], client_sequence, pt, hash_algo)
client_sequence += 1
client_counter += len(pt)//enc_block_length
print(pt)

ssh_payload = Unpack(SSH_PACKET, pt)["payload"]
message_from_client = Unpack(SSH_MSG_CHANNEL_DATA, ssh_payload)
ShowDict(message_from_client)
print("-"*120)
print(message_from_client["data"].decode())

##############################################################################

encrypted_payload = payloads[22]

print("="*120)
print(server_sequence, server_counter)

ct = encrypted_payload[:48]
mac = encrypted_payload[48:80]
iv = int.from_bytes(server_keys[0], "big") + server_counter
pt = AES_CTR(server_keys[1], iv, ct)
print(pt)
assert mac == HMAC_Generate(server_keys[2], server_sequence, pt, hash_algo)
server_sequence += 1
server_counter += len(pt)//enc_block_length

ssh_payload = Unpack(SSH_PACKET, pt)["payload"]
message_from_server = Unpack(SSH_MSG_CHANNEL_REQUEST, ssh_payload)
ShowDict(message_from_server)

print("="*120)
print(server_sequence, server_counter)

ct = encrypted_payload[80:128]
mac = encrypted_payload[128:160]
iv = int.from_bytes(server_keys[0], "big") + server_counter
pt = AES_CTR(server_keys[1], iv, ct)
print(pt)
assert mac == HMAC_Generate(server_keys[2], server_sequence, pt, hash_algo)
server_sequence += 1
server_counter += len(pt)//enc_block_length

ssh_payload = Unpack(SSH_PACKET, pt)["payload"]
message_from_server = Unpack(SSH_MSG_CHANNEL_REQUEST, ssh_payload)
ShowDict(message_from_server)

print("="*120)
print(server_sequence, server_counter)

ct = encrypted_payload[160:176]
mac = encrypted_payload[176:208]
iv = int.from_bytes(server_keys[0], "big") + server_counter
pt = AES_CTR(server_keys[1], iv, ct)
print(pt)
assert mac == HMAC_Generate(server_keys[2], server_sequence, pt, hash_algo)
server_sequence += 1
server_counter += len(pt)//enc_block_length

ssh_payload = Unpack(SSH_PACKET, pt)["payload"]
message_from_server = Unpack(SSH_MSG_CHANNEL_EOF, ssh_payload)
ShowDict(message_from_server)

print("="*120)
print(server_sequence, server_counter)

ct = encrypted_payload[208:224]
mac = encrypted_payload[224:256]
iv = int.from_bytes(server_keys[0], "big") + server_counter
pt = AES_CTR(server_keys[1], iv, ct)
print(pt)
assert mac == HMAC_Generate(server_keys[2], server_sequence, pt, hash_algo)
server_sequence += 1
server_counter += len(pt)//enc_block_length

ssh_payload = Unpack(SSH_PACKET, pt)["payload"]
message_from_server = Unpack(SSH_MSG_CHANNEL_EOF, ssh_payload)
ShowDict(message_from_server)
========================================================================================================================
9 17
b'\x00\x00\x00\x1c\r^\x00\x00\x00\x00\x00\x00\x00\x05exit\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
message_type                    : SSH_MSG_CHANNEL_DATA
recipient_channel               : 0
data_length                     : 5
data                            : b'exit\n'
------------------------------------------------------------------------------------------------------------------------
exit

========================================================================================================================
12 114
b'\x00\x00\x00,\x12b\x00\x00\x00\x00\x00\x00\x00\x0bexit-status\x00\x00\x00\x00\x00?\x10\xcdcPz\x82-\x9bb\x0f\xbc@&\xde\x85\xcf\xcd'
message_type                    : SSH_MSG_CHANNEL_REQUEST
recipient_channel               : 0
request_type_length             : 11
request_type                    : exit-status
want_reply                      : False
data                            : b'\x00\x00\x00\x00'
========================================================================================================================
13 117
b'\x00\x00\x00,\x12b\x00\x00\x00\x00\x00\x00\x00\x0feow@openssh.com\x00\x1fi\xc1\xc7;kv\xf4E\x84\xe1\xe4fX3\xc5v\x89'
message_type                    : SSH_MSG_CHANNEL_REQUEST
recipient_channel               : 0
request_type_length             : 15
request_type                    : eow@openssh.com
want_reply                      : False
========================================================================================================================
14 120
b'\x00\x00\x00\x0c\x06`\x00\x00\x00\x00\xd1\t-r\xbam'
message_type                    : SSH_MSG_CHANNEL_EOF
recipient_channel               : 0
========================================================================================================================
15 121
b'\x00\x00\x00\x0c\x06a\x00\x00\x00\x00\x80\xd3\x1dD\x10^'
message_type                    : SSH_MSG_CHANNEL_CLOSE
recipient_channel               : 0
In [27]:
encrypted_payload = payloads[23]

print("="*120)
print(client_sequence, client_counter)

ct = encrypted_payload[:-mac_length]
mac = encrypted_payload[-mac_length:]
iv = int.from_bytes(client_keys[0], "big") + client_counter
pt = AES_CTR(client_keys[1], iv, ct)
assert mac == HMAC_Generate(client_keys[2], client_sequence, pt, hash_algo)
client_sequence += 1
client_counter += len(pt)//enc_block_length
print(pt)

ssh_payload = Unpack(SSH_PACKET, pt)["payload"]
message_from_client = Unpack(SSH_MSG_CHANNEL_CLOSE, ssh_payload)
ShowDict(message_from_client)
========================================================================================================================
10 19
b'\x00\x00\x00\x1c\x16a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
message_type                    : SSH_MSG_CHANNEL_CLOSE
recipient_channel               : 0
In [28]:
encrypted_payload = payloads[24]

print("="*120)
print(client_sequence, client_counter)

ct = encrypted_payload[:-mac_length]
mac = encrypted_payload[-mac_length:]
iv = int.from_bytes(client_keys[0], "big") + client_counter
pt = AES_CTR(client_keys[1], iv, ct)
assert mac == HMAC_Generate(client_keys[2], client_sequence, pt, hash_algo)
client_sequence += 1
client_counter += len(pt)//enc_block_length
print(pt)

ssh_payload = Unpack(SSH_PACKET, pt)["payload"]
message_from_client = Unpack(SSH_MSG_DISCONNECT, ssh_payload)
ShowDict(message_from_client)
========================================================================================================================
11 21
b'\x00\x00\x00,\x0e\x01\x00\x00\x00\x0b\x00\x00\x00\x14disconnected by user\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
message_type                    : SSH_MSG_DISCONNECT
reason_code                     : 11
description_length              : 20
description                     : b'disconnected by user'