initial commit
This commit is contained in:
parent
1e08476cc6
commit
454aab1df3
367
README.md
367
README.md
@ -1,3 +1,368 @@
|
|||||||
# pseudodisk
|
# pseudodisk
|
||||||
|
|
||||||
Allows Creation of a file which then gets mounted as a hard drive under linux, allowing for hex editor practice.
|
A comprehensive toolkit for creating disk images with various filesystems for forensic analysis practice and education.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- **Multiple Filesystem Support**: NTFS, FAT32, exFAT, ext2/3/4, XFS
|
||||||
|
- **Partition Schemes**: GPT (modern) and MBR (legacy)
|
||||||
|
- **Interactive Configuration**: User-friendly prompts for all parameters
|
||||||
|
- **Automatic Loop Device Management**: Handles mounting and cleanup
|
||||||
|
- **Forensic-Ready**: Pre-configured for hex editor and forensic tool analysis
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
### Required Packages
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y \
|
||||||
|
parted \
|
||||||
|
util-linux \
|
||||||
|
e2fsprogs \
|
||||||
|
dosfstools
|
||||||
|
```
|
||||||
|
|
||||||
|
### Optional (for specific filesystems)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# For NTFS support
|
||||||
|
sudo apt-get install ntfs-3g
|
||||||
|
|
||||||
|
# For exFAT support
|
||||||
|
sudo apt-get install exfat-fuse exfat-utils
|
||||||
|
|
||||||
|
# For XFS support
|
||||||
|
sudo apt-get install xfsprogs
|
||||||
|
|
||||||
|
# For forensic analysis tools
|
||||||
|
sudo apt-get install sleuthkit
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
### Creating a Disk Image
|
||||||
|
|
||||||
|
Run the main script with sudo:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo ./create_forensic_disk.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
The script will interactively prompt you for:
|
||||||
|
|
||||||
|
1. **Filename**: Output file name (default: forensic_disk.dd)
|
||||||
|
2. **Size**: Choose from presets (100MB, 500MB, 1GB, 5GB) or custom
|
||||||
|
3. **Partition Scheme**: GPT or MBR
|
||||||
|
4. **Filesystem**: NTFS, FAT32, exFAT, ext2/3/4, XFS
|
||||||
|
5. **Volume Label**: Custom label for the filesystem
|
||||||
|
6. **Mount**: Option to mount immediately after creation
|
||||||
|
|
||||||
|
### Example Session
|
||||||
|
|
||||||
|
```
|
||||||
|
==========================================
|
||||||
|
Forensic Disk Image Creator
|
||||||
|
==========================================
|
||||||
|
|
||||||
|
Enter output filename (default: forensic_disk.dd): ntfsdisk.dd
|
||||||
|
|
||||||
|
Disk Size Options:
|
||||||
|
1) 100 MB (small, quick testing)
|
||||||
|
2) 500 MB (medium)
|
||||||
|
3) 1 GB (standard)
|
||||||
|
4) 5 GB (large)
|
||||||
|
5) Custom size
|
||||||
|
|
||||||
|
Select disk size [1-5]: 2
|
||||||
|
|
||||||
|
Partition Scheme:
|
||||||
|
1) GPT (GUID Partition Table) - Modern, Windows 10/11 default
|
||||||
|
2) MBR (Master Boot Record) - Legacy, compatible with older systems
|
||||||
|
|
||||||
|
Select partition scheme [1-2]: 1
|
||||||
|
|
||||||
|
Filesystem Type:
|
||||||
|
1) NTFS (Windows default, requires ntfs-3g)
|
||||||
|
2) FAT32 (Universal compatibility, 4GB file limit)
|
||||||
|
3) exFAT (Modern, large file support)
|
||||||
|
4) ext4 (Linux default)
|
||||||
|
5) ext3 (Older Linux)
|
||||||
|
6) ext2 (Legacy Linux, no journaling)
|
||||||
|
7) XFS (High-performance Linux)
|
||||||
|
|
||||||
|
Select filesystem [1-7]: 1
|
||||||
|
|
||||||
|
Enter volume label (default: FORENSIC): EVIDENCE
|
||||||
|
```
|
||||||
|
|
||||||
|
### Cleaning Up
|
||||||
|
|
||||||
|
When finished with your analysis, use the cleanup script:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Clean up a specific disk image
|
||||||
|
sudo ./cleanup_forensic_disk.sh
|
||||||
|
# Enter filename when prompted
|
||||||
|
|
||||||
|
# Or clean up all loop devices
|
||||||
|
sudo ./cleanup_forensic_disk.sh
|
||||||
|
# Type 'all' when prompted
|
||||||
|
```
|
||||||
|
|
||||||
|
## Forensic Analysis Guide
|
||||||
|
|
||||||
|
### Basic Hex Analysis
|
||||||
|
|
||||||
|
#### View raw disk structure
|
||||||
|
```bash
|
||||||
|
# Using hexdump
|
||||||
|
hexdump -C ntfsdisk.dd | less
|
||||||
|
|
||||||
|
# Using xxd
|
||||||
|
xxd ntfsdisk.dd | less
|
||||||
|
|
||||||
|
# View first 512 bytes (boot sector)
|
||||||
|
xxd -l 512 ntfsdisk.dd
|
||||||
|
|
||||||
|
# View specific offset (e.g., partition table at 0x1BE for MBR)
|
||||||
|
xxd -s 0x1BE -l 64 ntfsdisk.dd
|
||||||
|
```
|
||||||
|
|
||||||
|
#### GUI Hex Editors
|
||||||
|
```bash
|
||||||
|
# Install Bless (GTK hex editor)
|
||||||
|
sudo apt-get install bless
|
||||||
|
bless ntfsdisk.dd
|
||||||
|
|
||||||
|
# Or install GHex
|
||||||
|
sudo apt-get install ghex
|
||||||
|
ghex ntfsdisk.dd
|
||||||
|
|
||||||
|
# Or install wxHexEditor (advanced)
|
||||||
|
sudo apt-get install wxhexeditor
|
||||||
|
wxhexeditor ntfsdisk.dd
|
||||||
|
```
|
||||||
|
|
||||||
|
### Partition Analysis
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# View partition table
|
||||||
|
sudo parted ntfsdisk.dd print
|
||||||
|
|
||||||
|
# Or using fdisk
|
||||||
|
sudo fdisk -l ntfsdisk.dd
|
||||||
|
|
||||||
|
# For GPT, use gdisk
|
||||||
|
sudo apt-get install gdisk
|
||||||
|
sudo gdisk -l ntfsdisk.dd
|
||||||
|
```
|
||||||
|
|
||||||
|
### Using The Sleuth Kit (TSK)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Install if not already present
|
||||||
|
sudo apt-get install sleuthkit
|
||||||
|
|
||||||
|
# Display partition layout
|
||||||
|
mmls ntfsdisk.dd
|
||||||
|
|
||||||
|
# Show filesystem details (offset from mmls output)
|
||||||
|
fsstat -o 2048 ntfsdisk.dd
|
||||||
|
|
||||||
|
# List files in filesystem
|
||||||
|
fls -o 2048 -r ntfsdisk.dd
|
||||||
|
|
||||||
|
# Display file content by inode
|
||||||
|
icat -o 2048 ntfsdisk.dd [inode_number]
|
||||||
|
|
||||||
|
# Show deleted files
|
||||||
|
fls -o 2048 -rd ntfsdisk.dd
|
||||||
|
|
||||||
|
# Timeline analysis
|
||||||
|
fls -o 2048 -m / -r ntfsdisk.dd > timeline.bodyfile
|
||||||
|
mactime -b timeline.bodyfile
|
||||||
|
```
|
||||||
|
|
||||||
|
### Manual Loop Device Management
|
||||||
|
|
||||||
|
If you need more control over the loop device:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Attach image to loop device
|
||||||
|
sudo losetup -f ntfsdisk.dd
|
||||||
|
|
||||||
|
# List all loop devices
|
||||||
|
sudo losetup -l
|
||||||
|
|
||||||
|
# Find out which loop device is attached
|
||||||
|
sudo losetup -j ntfsdisk.dd
|
||||||
|
|
||||||
|
# Mount the partition
|
||||||
|
sudo mkdir -p /mnt/forensic
|
||||||
|
sudo mount /dev/loop0p1 /mnt/forensic
|
||||||
|
|
||||||
|
# When done, unmount
|
||||||
|
sudo umount /mnt/forensic
|
||||||
|
|
||||||
|
# Detach loop device
|
||||||
|
sudo losetup -d /dev/loop0
|
||||||
|
```
|
||||||
|
|
||||||
|
### Filesystem-Specific Analysis
|
||||||
|
|
||||||
|
#### NTFS Analysis
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# View NTFS volume information
|
||||||
|
sudo apt-get install ntfs-3g
|
||||||
|
sudo ntfsinfo -m /dev/loop0p1
|
||||||
|
|
||||||
|
# Show NTFS file system usage
|
||||||
|
sudo ntfscluster -f /dev/loop0p1
|
||||||
|
|
||||||
|
# Recover deleted files
|
||||||
|
sudo apt-get install testdisk
|
||||||
|
sudo testdisk ntfsdisk.dd
|
||||||
|
```
|
||||||
|
|
||||||
|
#### FAT32 Analysis
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# View FAT information
|
||||||
|
sudo fsck.vfat -n /dev/loop0p1
|
||||||
|
|
||||||
|
# Or using sleuthkit
|
||||||
|
fsstat -o 2048 ntfsdisk.dd
|
||||||
|
```
|
||||||
|
|
||||||
|
#### ext4 Analysis
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Dump ext4 superblock
|
||||||
|
sudo dumpe2fs /dev/loop0p1
|
||||||
|
|
||||||
|
# Check filesystem
|
||||||
|
sudo e2fsck -n /dev/loop0p1
|
||||||
|
|
||||||
|
# Show inode information
|
||||||
|
sudo debugfs -R 'stat <inode>' /dev/loop0p1
|
||||||
|
```
|
||||||
|
|
||||||
|
## Key Forensic Structures to Examine
|
||||||
|
|
||||||
|
### Master Boot Record (MBR)
|
||||||
|
- **Location**: First 512 bytes (0x000-0x1FF)
|
||||||
|
- **Boot Code**: 0x000-0x1BD (446 bytes)
|
||||||
|
- **Partition Table**: 0x1BE-0x1FD (64 bytes, 4 entries × 16 bytes)
|
||||||
|
- **Signature**: 0x1FE-0x1FF (0x55AA)
|
||||||
|
|
||||||
|
### GUID Partition Table (GPT)
|
||||||
|
- **Protective MBR**: Sector 0 (0x000-0x1FF)
|
||||||
|
- **GPT Header**: Sector 1 (0x200-0x3FF)
|
||||||
|
- **Partition Entries**: Sectors 2-33 (typically)
|
||||||
|
- **Backup GPT**: Last sectors of disk
|
||||||
|
|
||||||
|
### NTFS Boot Sector
|
||||||
|
- **Jump Instruction**: 0x000-0x002
|
||||||
|
- **OEM ID**: 0x003-0x00A ("NTFS ")
|
||||||
|
- **Bytes Per Sector**: 0x00B-0x00C
|
||||||
|
- **Sectors Per Cluster**: 0x00D
|
||||||
|
- **MFT Location**: 0x030-0x037
|
||||||
|
- **Signature**: 0x1FE-0x1FF (0x55AA)
|
||||||
|
|
||||||
|
### FAT32 Boot Sector
|
||||||
|
- **Jump Instruction**: 0x000-0x002
|
||||||
|
- **OEM Name**: 0x003-0x00A
|
||||||
|
- **Bytes Per Sector**: 0x00B-0x00C
|
||||||
|
- **Sectors Per Cluster**: 0x00D
|
||||||
|
- **FAT Copies**: 0x010
|
||||||
|
- **Signature**: 0x1FE-0x1FF (0x55AA)
|
||||||
|
|
||||||
|
## Practice Exercises
|
||||||
|
|
||||||
|
### Beginner Level
|
||||||
|
|
||||||
|
1. **Identify Partition Scheme**
|
||||||
|
- Create disks with GPT and MBR
|
||||||
|
- Compare the first 512 bytes
|
||||||
|
- Identify the signature differences
|
||||||
|
|
||||||
|
2. **Find the Filesystem Type**
|
||||||
|
- Create disks with different filesystems
|
||||||
|
- Examine boot sector signatures
|
||||||
|
- Identify OEM strings
|
||||||
|
|
||||||
|
3. **Locate Partition Boundaries**
|
||||||
|
- Use hexdump to find partition start
|
||||||
|
- Verify with `parted` output
|
||||||
|
|
||||||
|
### Intermediate Level
|
||||||
|
|
||||||
|
4. **File Recovery Practice**
|
||||||
|
- Mount filesystem, create files, unmount
|
||||||
|
- Delete files from another mount
|
||||||
|
- Practice recovering deleted files
|
||||||
|
|
||||||
|
5. **Metadata Analysis**
|
||||||
|
- Create files with specific timestamps
|
||||||
|
- Use TSK to extract timeline data
|
||||||
|
- Correlate timestamps with hex data
|
||||||
|
|
||||||
|
6. **Slack Space Investigation**
|
||||||
|
- Create small files in large clusters
|
||||||
|
- Examine slack space for data remnants
|
||||||
|
- Understand cluster allocation
|
||||||
|
|
||||||
|
### Advanced Level
|
||||||
|
|
||||||
|
7. **Steganography Detection**
|
||||||
|
- Hide data in slack space
|
||||||
|
- Practice identifying hidden data
|
||||||
|
- Compare expected vs actual cluster usage
|
||||||
|
|
||||||
|
8. **Partition Hiding**
|
||||||
|
- Create multiple partitions
|
||||||
|
- Modify partition table
|
||||||
|
- Practice recovering hidden partitions
|
||||||
|
|
||||||
|
9. **Anti-Forensics Techniques**
|
||||||
|
- Study timestamp manipulation
|
||||||
|
- Examine wiping patterns
|
||||||
|
- Analyze file system corruption
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Loop device not found
|
||||||
|
```bash
|
||||||
|
# Ensure loop module is loaded
|
||||||
|
sudo modprobe loop
|
||||||
|
|
||||||
|
# Check available loop devices
|
||||||
|
ls -la /dev/loop*
|
||||||
|
```
|
||||||
|
|
||||||
|
### Permission denied
|
||||||
|
```bash
|
||||||
|
# Always use sudo for these operations
|
||||||
|
sudo ./create_forensic_disk.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### Partition not showing up
|
||||||
|
```bash
|
||||||
|
# Force kernel to re-read partition table
|
||||||
|
sudo partprobe /dev/loopX
|
||||||
|
|
||||||
|
# Or detach and re-attach
|
||||||
|
sudo losetup -d /dev/loopX
|
||||||
|
sudo losetup -f ntfsdisk.dd
|
||||||
|
```
|
||||||
|
|
||||||
|
### Cannot unmount - device busy
|
||||||
|
```bash
|
||||||
|
# Find what's using it
|
||||||
|
sudo lsof | grep /mnt/forensic
|
||||||
|
|
||||||
|
# Force unmount (use with caution)
|
||||||
|
sudo umount -l /mnt/forensic
|
||||||
|
```
|
||||||
116
cleanup.sh
Executable file
116
cleanup.sh
Executable file
@ -0,0 +1,116 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Forensic Disk Image Cleanup Helper
|
||||||
|
# Safely unmounts and detaches loop devices
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
NC='\033[0m'
|
||||||
|
|
||||||
|
print_info() {
|
||||||
|
echo -e "${BLUE}[INFO]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
print_success() {
|
||||||
|
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
print_warning() {
|
||||||
|
echo -e "${YELLOW}[WARNING]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
print_error() {
|
||||||
|
echo -e "${RED}[ERROR]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ "$EUID" -ne 0 ]; then
|
||||||
|
print_error "This script must be run as root (use sudo)"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=========================================="
|
||||||
|
echo " Forensic Disk Cleanup Tool"
|
||||||
|
echo "=========================================="
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Show current loop devices
|
||||||
|
print_info "Current loop devices:"
|
||||||
|
losetup -l
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
read -p "Enter the disk image filename to clean up (or 'all' for all loop devices): " TARGET
|
||||||
|
|
||||||
|
if [ "$TARGET" = "all" ]; then
|
||||||
|
print_warning "This will unmount and detach ALL loop devices!"
|
||||||
|
read -p "Are you sure? (yes/no): " CONFIRM
|
||||||
|
|
||||||
|
if [ "$CONFIRM" = "yes" ]; then
|
||||||
|
# Get all loop devices
|
||||||
|
LOOP_DEVICES=$(losetup -l -n -O NAME | tail -n +2)
|
||||||
|
|
||||||
|
for LOOP in $LOOP_DEVICES; do
|
||||||
|
print_info "Processing $LOOP..."
|
||||||
|
|
||||||
|
# Try to unmount all partitions
|
||||||
|
for PART in ${LOOP}p* ${LOOP}[0-9]*; do
|
||||||
|
if [ -e "$PART" ]; then
|
||||||
|
MOUNT_POINT=$(findmnt -n -o TARGET "$PART" 2>/dev/null || true)
|
||||||
|
if [ -n "$MOUNT_POINT" ]; then
|
||||||
|
print_info "Unmounting $PART from $MOUNT_POINT"
|
||||||
|
umount "$PART" || print_warning "Failed to unmount $PART"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Detach loop device
|
||||||
|
print_info "Detaching $LOOP"
|
||||||
|
losetup -d "$LOOP" || print_warning "Failed to detach $LOOP"
|
||||||
|
done
|
||||||
|
|
||||||
|
print_success "Cleanup complete"
|
||||||
|
else
|
||||||
|
print_info "Cancelled"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if [ ! -f "$TARGET" ]; then
|
||||||
|
print_error "File not found: $TARGET"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Find loop device associated with this file
|
||||||
|
LOOP_DEVICE=$(losetup -l -n -O NAME,BACK-FILE | grep "$(realpath $TARGET)" | awk '{print $1}')
|
||||||
|
|
||||||
|
if [ -z "$LOOP_DEVICE" ]; then
|
||||||
|
print_warning "No loop device found for $TARGET"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
print_info "Found loop device: $LOOP_DEVICE"
|
||||||
|
|
||||||
|
# Try to unmount all partitions
|
||||||
|
for PART in ${LOOP_DEVICE}p* ${LOOP_DEVICE}[0-9]*; do
|
||||||
|
if [ -e "$PART" ]; then
|
||||||
|
MOUNT_POINT=$(findmnt -n -o TARGET "$PART" 2>/dev/null || true)
|
||||||
|
if [ -n "$MOUNT_POINT" ]; then
|
||||||
|
print_info "Unmounting $PART from $MOUNT_POINT"
|
||||||
|
umount "$PART" || print_warning "Failed to unmount $PART"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Detach loop device
|
||||||
|
print_info "Detaching $LOOP_DEVICE"
|
||||||
|
losetup -d "$LOOP_DEVICE"
|
||||||
|
|
||||||
|
print_success "Cleanup complete for $TARGET"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
print_info "Current loop devices after cleanup:"
|
||||||
|
losetup -l
|
||||||
|
echo ""
|
||||||
394
pseudodisk.sh
Executable file
394
pseudodisk.sh
Executable file
@ -0,0 +1,394 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Forensic Practice Disk Image Creator
|
||||||
|
# Creates disk images with various filesystems for forensic analysis practice
|
||||||
|
|
||||||
|
set -e # Exit on error
|
||||||
|
|
||||||
|
# Color codes for output
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
# Function to print colored messages
|
||||||
|
print_info() {
|
||||||
|
echo -e "${BLUE}[INFO]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
print_success() {
|
||||||
|
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
print_warning() {
|
||||||
|
echo -e "${YELLOW}[WARNING]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
print_error() {
|
||||||
|
echo -e "${RED}[ERROR]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check if running as root
|
||||||
|
check_root() {
|
||||||
|
if [ "$EUID" -ne 0 ]; then
|
||||||
|
print_error "This script must be run as root (use sudo)"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to check required tools
|
||||||
|
check_dependencies() {
|
||||||
|
local missing_tools=()
|
||||||
|
|
||||||
|
command -v dd >/dev/null 2>&1 || missing_tools+=("coreutils")
|
||||||
|
command -v losetup >/dev/null 2>&1 || missing_tools+=("util-linux")
|
||||||
|
command -v parted >/dev/null 2>&1 || missing_tools+=("parted")
|
||||||
|
command -v mkfs.ext4 >/dev/null 2>&1 || missing_tools+=("e2fsprogs")
|
||||||
|
|
||||||
|
if [ ${#missing_tools[@]} -gt 0 ]; then
|
||||||
|
print_error "Missing required packages: ${missing_tools[*]}"
|
||||||
|
print_info "Install with: sudo apt-get install ${missing_tools[*]}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Display banner
|
||||||
|
show_banner() {
|
||||||
|
echo ""
|
||||||
|
echo "=========================================="
|
||||||
|
echo " Forensic Disk Image Creator"
|
||||||
|
echo "=========================================="
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
# Get filename from user
|
||||||
|
get_filename() {
|
||||||
|
echo ""
|
||||||
|
read -p "Enter output filename (default: forensic_disk.dd): " FILENAME
|
||||||
|
FILENAME=${FILENAME:-forensic_disk.dd}
|
||||||
|
|
||||||
|
if [ -f "$FILENAME" ]; then
|
||||||
|
read -p "File already exists. Overwrite? (y/n): " OVERWRITE
|
||||||
|
if [ "$OVERWRITE" != "y" ]; then
|
||||||
|
print_info "Exiting..."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Get disk size from user
|
||||||
|
get_disk_size() {
|
||||||
|
echo ""
|
||||||
|
echo "Disk Size Options:"
|
||||||
|
echo " 1) 100 MB (small, quick testing)"
|
||||||
|
echo " 2) 500 MB (medium)"
|
||||||
|
echo " 3) 1 GB (standard)"
|
||||||
|
echo " 4) 5 GB (large)"
|
||||||
|
echo " 5) Custom size"
|
||||||
|
echo ""
|
||||||
|
read -p "Select disk size [1-5]: " SIZE_CHOICE
|
||||||
|
|
||||||
|
case $SIZE_CHOICE in
|
||||||
|
1) DISK_SIZE_MB=100 ;;
|
||||||
|
2) DISK_SIZE_MB=500 ;;
|
||||||
|
3) DISK_SIZE_MB=1024 ;;
|
||||||
|
4) DISK_SIZE_MB=5120 ;;
|
||||||
|
5)
|
||||||
|
read -p "Enter size in MB: " DISK_SIZE_MB
|
||||||
|
if ! [[ "$DISK_SIZE_MB" =~ ^[0-9]+$ ]] || [ "$DISK_SIZE_MB" -lt 10 ]; then
|
||||||
|
print_error "Invalid size. Must be at least 10 MB"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
print_error "Invalid choice"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
print_info "Selected disk size: ${DISK_SIZE_MB} MB"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Get partition scheme
|
||||||
|
get_partition_scheme() {
|
||||||
|
echo ""
|
||||||
|
echo "Partition Scheme:"
|
||||||
|
echo " 1) GPT (GUID Partition Table) - Modern, Windows 10/11 default"
|
||||||
|
echo " 2) MBR (Master Boot Record) - Legacy, compatible with older systems"
|
||||||
|
echo ""
|
||||||
|
read -p "Select partition scheme [1-2]: " PARTITION_CHOICE
|
||||||
|
|
||||||
|
case $PARTITION_CHOICE in
|
||||||
|
1) PARTITION_SCHEME="gpt" ;;
|
||||||
|
2) PARTITION_SCHEME="msdos" ;;
|
||||||
|
*)
|
||||||
|
print_error "Invalid choice"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
print_info "Selected partition scheme: $PARTITION_SCHEME"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Get filesystem type
|
||||||
|
get_filesystem() {
|
||||||
|
echo ""
|
||||||
|
echo "Filesystem Type:"
|
||||||
|
echo " 1) NTFS (Windows default, requires ntfs-3g)"
|
||||||
|
echo " 2) FAT32 (Universal compatibility, 4GB file limit)"
|
||||||
|
echo " 3) exFAT (Modern, large file support)"
|
||||||
|
echo " 4) ext4 (Linux default)"
|
||||||
|
echo " 5) ext3 (Older Linux)"
|
||||||
|
echo " 6) ext2 (Legacy Linux, no journaling)"
|
||||||
|
echo " 7) XFS (High-performance Linux)"
|
||||||
|
echo ""
|
||||||
|
read -p "Select filesystem [1-7]: " FS_CHOICE
|
||||||
|
|
||||||
|
case $FS_CHOICE in
|
||||||
|
1)
|
||||||
|
FILESYSTEM="ntfs"
|
||||||
|
if ! command -v mkfs.ntfs >/dev/null 2>&1; then
|
||||||
|
print_error "mkfs.ntfs not found. Install with: sudo apt-get install ntfs-3g"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
2) FILESYSTEM="vfat" ;;
|
||||||
|
3)
|
||||||
|
FILESYSTEM="exfat"
|
||||||
|
if ! command -v mkfs.exfat >/dev/null 2>&1; then
|
||||||
|
print_error "mkfs.exfat not found. Install with: sudo apt-get install exfat-utils"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
4) FILESYSTEM="ext4" ;;
|
||||||
|
5) FILESYSTEM="ext3" ;;
|
||||||
|
6) FILESYSTEM="ext2" ;;
|
||||||
|
7)
|
||||||
|
FILESYSTEM="xfs"
|
||||||
|
if ! command -v mkfs.xfs >/dev/null 2>&1; then
|
||||||
|
print_error "mkfs.xfs not found. Install with: sudo apt-get install xfsprogs"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
print_error "Invalid choice"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
print_info "Selected filesystem: $FILESYSTEM"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Get volume label
|
||||||
|
get_volume_label() {
|
||||||
|
echo ""
|
||||||
|
read -p "Enter volume label (default: FORENSIC): " VOLUME_LABEL
|
||||||
|
VOLUME_LABEL=${VOLUME_LABEL:-FORENSIC}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Create the disk image
|
||||||
|
create_disk_image() {
|
||||||
|
print_info "Creating disk image file: $FILENAME (${DISK_SIZE_MB} MB)..."
|
||||||
|
|
||||||
|
# Use fallocate for faster creation if available
|
||||||
|
if command -v fallocate >/dev/null 2>&1; then
|
||||||
|
fallocate -l ${DISK_SIZE_MB}M "$FILENAME"
|
||||||
|
else
|
||||||
|
dd if=/dev/zero of="$FILENAME" bs=1M count=$DISK_SIZE_MB status=progress
|
||||||
|
fi
|
||||||
|
|
||||||
|
print_success "Disk image created"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Setup loop device
|
||||||
|
setup_loop_device() {
|
||||||
|
print_info "Setting up loop device..."
|
||||||
|
LOOP_DEVICE=$(losetup -f)
|
||||||
|
losetup "$LOOP_DEVICE" "$FILENAME"
|
||||||
|
print_success "Loop device created: $LOOP_DEVICE"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Create partition table and partition
|
||||||
|
create_partitions() {
|
||||||
|
print_info "Creating $PARTITION_SCHEME partition table..."
|
||||||
|
|
||||||
|
parted -s "$LOOP_DEVICE" mklabel "$PARTITION_SCHEME"
|
||||||
|
|
||||||
|
print_info "Creating partition..."
|
||||||
|
|
||||||
|
if [ "$PARTITION_SCHEME" = "gpt" ]; then
|
||||||
|
# For GPT, leave 1MB at start and end for alignment
|
||||||
|
parted -s "$LOOP_DEVICE" mkpart primary 1MiB 100%
|
||||||
|
else
|
||||||
|
# For MBR
|
||||||
|
parted -s "$LOOP_DEVICE" mkpart primary 1MiB 100%
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Inform kernel about partition table changes
|
||||||
|
partprobe "$LOOP_DEVICE"
|
||||||
|
sleep 1
|
||||||
|
|
||||||
|
print_success "Partition created"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Format the partition
|
||||||
|
format_partition() {
|
||||||
|
PARTITION="${LOOP_DEVICE}p1"
|
||||||
|
|
||||||
|
# Check if partition device exists
|
||||||
|
if [ ! -e "$PARTITION" ]; then
|
||||||
|
print_warning "Partition device $PARTITION not found, trying alternative..."
|
||||||
|
PARTITION="${LOOP_DEVICE}1"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -e "$PARTITION" ]; then
|
||||||
|
print_error "Cannot find partition device"
|
||||||
|
cleanup
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
print_info "Formatting partition with $FILESYSTEM filesystem..."
|
||||||
|
|
||||||
|
case $FILESYSTEM in
|
||||||
|
ntfs)
|
||||||
|
mkfs.ntfs -f -L "$VOLUME_LABEL" "$PARTITION"
|
||||||
|
;;
|
||||||
|
vfat)
|
||||||
|
mkfs.vfat -n "$VOLUME_LABEL" "$PARTITION"
|
||||||
|
;;
|
||||||
|
exfat)
|
||||||
|
mkfs.exfat -n "$VOLUME_LABEL" "$PARTITION"
|
||||||
|
;;
|
||||||
|
ext2|ext3|ext4)
|
||||||
|
mkfs."$FILESYSTEM" -L "$VOLUME_LABEL" "$PARTITION"
|
||||||
|
;;
|
||||||
|
xfs)
|
||||||
|
mkfs.xfs -f -L "$VOLUME_LABEL" "$PARTITION"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
print_success "Filesystem created"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Cleanup function
|
||||||
|
cleanup() {
|
||||||
|
if [ -n "$LOOP_DEVICE" ]; then
|
||||||
|
print_info "Cleaning up loop device..."
|
||||||
|
losetup -d "$LOOP_DEVICE" 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Mount the filesystem
|
||||||
|
mount_filesystem() {
|
||||||
|
echo ""
|
||||||
|
read -p "Do you want to mount the filesystem now? (y/n): " MOUNT_NOW
|
||||||
|
|
||||||
|
if [ "$MOUNT_NOW" = "y" ]; then
|
||||||
|
MOUNT_POINT="/mnt/forensic_disk_$$"
|
||||||
|
mkdir -p "$MOUNT_POINT"
|
||||||
|
|
||||||
|
print_info "Mounting to $MOUNT_POINT..."
|
||||||
|
mount "$PARTITION" "$MOUNT_POINT"
|
||||||
|
|
||||||
|
print_success "Filesystem mounted at: $MOUNT_POINT"
|
||||||
|
print_info "To unmount: sudo umount $MOUNT_POINT"
|
||||||
|
|
||||||
|
MOUNTED=true
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Display summary
|
||||||
|
show_summary() {
|
||||||
|
echo ""
|
||||||
|
echo "=========================================="
|
||||||
|
echo " Disk Image Creation Complete!"
|
||||||
|
echo "=========================================="
|
||||||
|
echo ""
|
||||||
|
echo "Image File: $(realpath $FILENAME)"
|
||||||
|
echo "Size: ${DISK_SIZE_MB} MB"
|
||||||
|
echo "Partition Scheme: $PARTITION_SCHEME"
|
||||||
|
echo "Filesystem: $FILESYSTEM"
|
||||||
|
echo "Volume Label: $VOLUME_LABEL"
|
||||||
|
echo "Loop Device: $LOOP_DEVICE"
|
||||||
|
echo "Partition: $PARTITION"
|
||||||
|
if [ "$MOUNTED" = true ]; then
|
||||||
|
echo "Mount Point: $MOUNT_POINT"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
echo "=========================================="
|
||||||
|
echo " Forensic Analysis Commands"
|
||||||
|
echo "=========================================="
|
||||||
|
echo ""
|
||||||
|
echo "View partition table:"
|
||||||
|
echo " sudo parted $FILENAME print"
|
||||||
|
echo " sudo fdisk -l $FILENAME"
|
||||||
|
echo ""
|
||||||
|
echo "Hex editor analysis:"
|
||||||
|
echo " hexdump -C $FILENAME | less"
|
||||||
|
echo " xxd $FILENAME | less"
|
||||||
|
echo " sudo apt-get install bless # GUI hex editor"
|
||||||
|
echo " bless $FILENAME"
|
||||||
|
echo ""
|
||||||
|
echo "Mount the image later:"
|
||||||
|
echo " sudo losetup -f $FILENAME"
|
||||||
|
echo " sudo losetup -l # List loop devices"
|
||||||
|
echo " sudo mount /dev/loopXp1 /mnt/mountpoint"
|
||||||
|
echo ""
|
||||||
|
echo "Analyze with forensic tools:"
|
||||||
|
echo " sudo apt-get install sleuthkit"
|
||||||
|
echo " mmls $FILENAME # Show partition layout"
|
||||||
|
echo " fsstat -o 2048 $FILENAME # Filesystem details"
|
||||||
|
echo " fls -o 2048 $FILENAME # List files"
|
||||||
|
echo ""
|
||||||
|
echo "Clean up (when done):"
|
||||||
|
if [ "$MOUNTED" = true ]; then
|
||||||
|
echo " sudo umount $MOUNT_POINT"
|
||||||
|
fi
|
||||||
|
echo " sudo losetup -d $LOOP_DEVICE"
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
# Trap to ensure cleanup on exit
|
||||||
|
trap cleanup EXIT
|
||||||
|
|
||||||
|
# Main execution
|
||||||
|
main() {
|
||||||
|
show_banner
|
||||||
|
check_root
|
||||||
|
check_dependencies
|
||||||
|
|
||||||
|
get_filename
|
||||||
|
get_disk_size
|
||||||
|
get_partition_scheme
|
||||||
|
get_filesystem
|
||||||
|
get_volume_label
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=========================================="
|
||||||
|
echo " Summary"
|
||||||
|
echo "=========================================="
|
||||||
|
echo "Filename: $FILENAME"
|
||||||
|
echo "Size: ${DISK_SIZE_MB} MB"
|
||||||
|
echo "Partition Scheme: $PARTITION_SCHEME"
|
||||||
|
echo "Filesystem: $FILESYSTEM"
|
||||||
|
echo "Volume Label: $VOLUME_LABEL"
|
||||||
|
echo ""
|
||||||
|
read -p "Proceed with creation? (y/n): " CONFIRM
|
||||||
|
|
||||||
|
if [ "$CONFIRM" != "y" ]; then
|
||||||
|
print_info "Cancelled"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
create_disk_image
|
||||||
|
setup_loop_device
|
||||||
|
create_partitions
|
||||||
|
format_partition
|
||||||
|
mount_filesystem
|
||||||
|
|
||||||
|
show_summary
|
||||||
|
}
|
||||||
|
|
||||||
|
# Run main function
|
||||||
|
main
|
||||||
Loading…
x
Reference in New Issue
Block a user