Overview#

Cyber ToolBox is my first project using C#, .NET, Visual Studio, and an Oracle database. The main goal was to learn these technologies before starting my end-of-degree internship.

The application is a small web toolbox that provides several security-related checks by calling external APIs. The overall difficulty of the project is not especially high, but it was still a good way to get comfortable with a new stack in a short time.

Features#

  • Dashboard
  • Password Checker
  • IP Checker
  • URL Checker
  • History

Tech Stack#

  • Front-end: ASP.NET Core Razor
  • Back-end: ASP.NET Core with C# services
  • Database: Oracle

UI / UX#

Since design is not my strongest skill, I decided to delegate the UI ideas to Google Stitch. These are the interfaces of the application.

Dashboard#

Dashboard screenshot

Password Check#

Password Check screenshot

IP Check#

IP Check screenshot

URL Check#

URL Check screenshot

I did not want to spend too much time building the front-end by hand because it’s not the point of the project, so I also used Codex to generate the full front-end structure.

Database Design#

Common Columns#

Each history table shares the same four technical columns:

Column Type Notes
ID NUMBER(19) Primary key, Oracle Identity auto-increment
REQUESTED_AT_UTC TIMESTAMP(7) WITH TIME ZONE Required
STATUS NVARCHAR2(32) Required
ERROR_MESSAGE NVARCHAR2(1000) Nullable

Possible values for STATUS:

  • Completed
  • Rejected
  • Error

Table: IP_CHECK_HISTORY#

Stores IP lookup requests using AbuseIPDB and Shodan.

Column Type Notes
IP_ADDRESS NVARCHAR2(45) Input IP address
ABUSE_CONFIDENCE_SCORE NUMBER(10) AbuseIPDB score
COUNTRY_CODE NVARCHAR2(8) Country code
COUNTRY_NAME NVARCHAR2(128) Country name
NETWORK_NAME NVARCHAR2(255) Network / ISP name
HOSTNAME NVARCHAR2(255) Host name
OPEN_PORTS_COUNT NUMBER(10) Number of open ports
OPEN_PORTS_TEXT NVARCHAR2(512) Open ports as text
VERDICT NVARCHAR2(64) Final verdict
TOTAL_REPORTS NUMBER(10) Total abuse reports
DISTINCT_REPORTERS NUMBER(10) Number of distinct reporters
LAST_REPORTED_AT_UTC TIMESTAMP(7) WITH TIME ZONE Last report date
SHODAN_STATUS NVARCHAR2(32) Shodan request status

Table: URL_CHECK_HISTORY#

Stores URL checks.

Column Type Notes
INPUT_VALUE NCLOB Raw user input
NORMALIZED_URL NCLOB Cleaned and normalized URL
IS_VALID NUMBER(10) Boolean-like value: 0 or 1
IS_LISTED NUMBER(10) Boolean-like value: 0 or 1
VERDICT NVARCHAR2(64) Final verdict
SUMMARY NVARCHAR2(1000) Short result summary
THREAT NVARCHAR2(255) Threat category
URL_STATUS NVARCHAR2(128) URLhaus result status
HOST NVARCHAR2(255) Host name
REFERENCE NVARCHAR2(1000) Reference link or detail
DATE_ADDED_TEXT NVARCHAR2(128) Text version of the add date
TAGS_TEXT NVARCHAR2(1000) Tags as text

Table: PASSWORD_CHECK_HISTORY#

Stores password checks without storing any secret.

Column Type Notes
IS_PWNED NUMBER(10) Boolean-like value: 0 or 1
PWN_COUNT NUMBER(10) Number of leaks found
LENGTH_OK NUMBER(10) Boolean-like value: 0 or 1
CHAR_DIVERSITY NUMBER(10) Boolean-like value: 0 or 1
VERDICT NVARCHAR2(64) Final verdict

Important: no password is stored in the database.

Feature Explanation#

Dashboard#

The dashboard reads the three Oracle history tables. It:

  • counts the total number of scans,
  • counts clean, flagged, and error results,
  • mixes the latest rows from the three modules to show recent activity.

The Delete History button clears all three history tables.

IP Check#

The user enters an IP address. The application first checks whether the input is a valid IP.

If it is valid:

  1. it calls AbuseIPDB to get the IP reputation,
  2. it calls Shodan to retrieve open ports,
  3. it builds a verdict from the AbuseIPDB score,
  4. it stores the result in IP_CHECK_HISTORY.

Verdict logic:

0      -> Clean
1-24   -> Review
25-74  -> Suspicious
75+    -> Malicious

URL Check#

The user enters a URL or a domain. The application cleans the input, adds https:// when needed, and checks whether the URL is valid.

If the URL is valid, it queries URLhaus. The API response is interpreted like this:

ok         -> the URL is known as malicious
no_results -> the URL was not found
other      -> error

The application then displays a simple verdict and stores the result in URL_CHECK_HISTORY.

Password Check#

The user enters a password. The application computes the SHA-1 hash locally.

That hash is split into two parts:

first 5 characters  -> sent to the HIBP API
remaining suffix    -> kept locally

The API returns a list of suffixes matching the prefix. The application then compares the local suffix with the returned list.

  • If the suffix is found, the password has already appeared in a breach.
  • Otherwise, it is not found in the database.

The application also checks:

  • length >= 8
  • character diversity: lowercase, uppercase, digit, special character

Final verdict:

Compromised -> found in HIBP
Strong      -> long enough and diverse enough
Weak        -> otherwise

Conclusion#

This project allowed me to use C#, Visual Studio, and Oracle DB for the first time. Since I already had some experience with Java, learning the stack was not too difficult. The features were also simple enough for me to finish the project in a single weekend, and I enjoyed building it.

Repository: 0xEfeA/Cyber-ToolBox