├── README.md
├── phantom.py
└── requirements.txt
/README.md:
--------------------------------------------------------------------------------
1 | [](https://www.python.org/)
2 |
3 |
4 |
5 |
6 | PHANTOM
7 |
8 | Why buy a burner phone, when Phantom allows you to text anyone... anonymously!
9 |
10 |
11 | [](https://github.com/SkippyTheTracer/phantom)
12 |
13 | # 📖 Description
14 | **PHANTOM** is a simple Python script that enables a user to text a victim from an anonymous number. The program uses the 'textbelt' API to communicate with a victim using a random generated phone number. Not only can you spoof messages, you can now also receive messages between you and the victim using the integrated webhook option. With an incredibly simple UI, sms spoofing has never been easier!
15 |
16 | # 🎥 Demo
17 | 
18 |
19 | # ⚖️ Legal Disclaimer:
20 | **FOR EDUCATIONAL PURPOSES ONLY!**
21 | Misuse of **PHANTOM** is illegal. It's the end user's responsibility to obey all applicable local, state and federal laws. The developer assumes no liability and is not responsible for any misuse or damage caused by this program. Use Responsibly!
22 |
23 |
24 |
25 | # ⚙️ Installation
26 | ```console
27 | skippy@kali:~$ git clone https://github.com/AlgorithmNerd/phantom/
28 | skippy@kali:~$ cd phantom
29 | skippy@kali:~$ pip3 install -r requirements.txt
30 | ```
31 | # ▶ Run
32 | ```console
33 | skippy@kali:~$ python3 phantom.py
34 | ```
35 | # 🧰 Requirements
36 | ### TEXTBELT
37 | In order to use **PHANTOM** at it's full capacity, you must first purchase an API key from https://textbelt.com/purchase/
38 |
39 |
40 |
41 | You are also able to use the API key **textbelt** for one **FREE** message!
42 |
43 | ### WEBHOOK
44 | It's not necessary to obtain a webhook url, unless you would like to receive messages. You can find a unique webhook url at https://webhook.site/
45 |
46 |
47 |
48 | # 💻 Usage
49 | ## Sending a Text
50 | Once the program is running, you will be asked to enter the victim's phone number.
51 | ```shell script
52 | Phone Number:
53 | ```
54 | You will then be prompted to enter a message. This will be the message sent to the victim.
55 | ```shell script
56 | Message:
57 | ```
58 | Now it is time to add your API key. Input the key provided by https://textbelt.com
59 | ```shell script
60 | Key:
61 | ```
62 | Now that you are ready to send the message, you will be asked if you would like to receive responses from the victim. If yes, type 'yes'. You will then be given the option to input your webhook url (as shown in the above example). If not, type "no".
63 | ```shell script
64 | Would you like to receive reply messages? yes/no
65 | ```
66 | Now that all of the steps have been completed, your message will be sent to the victim. You will be asked if you would like to send more messages. If your answer is no, the program will stop running.
67 | ## Receiving a Text
68 | During the above process, you will be able to view the responses through your 'webhook.site' url. Be sure to look out for the **POST** requests, as they will contain the victim's responses.
69 |
70 |
71 | ### Now that you have learnt to use **PHANTOM**, be sure to have fun!
72 |
--------------------------------------------------------------------------------
/phantom.py:
--------------------------------------------------------------------------------
1 | import requests
2 | import time
3 | import json
4 | from pyfiglet import figlet_format
5 |
6 | print("\nCreated by AlgorithmNerd")
7 | print(figlet_format("PHANTOM", font = "doom"))
8 |
9 | phone_number = input("Phone Number: ")
10 | text_message = input("Message: ")
11 | custom_key = input("Key: ")
12 |
13 | webhook_question = input("Would you like to receive reply messages? yes/no\n")
14 | if webhook_question == 'yes':
15 | webhook_url = input("Webhook URL: ")
16 | resp = requests.post('https://textbelt.com/text', {
17 | 'phone': phone_number,
18 | 'message': text_message,
19 | 'replyWebhookUrl': webhook_url,
20 | 'key': custom_key,
21 | })
22 | else:
23 | webhook_url = " "
24 | resp = requests.post('https://textbelt.com/text', {
25 | 'phone': phone_number,
26 | 'message': text_message,
27 | 'replyWebhookUrl': webhook_url,
28 | 'key': custom_key,
29 | })
30 |
31 | result = resp.json()
32 | list_values = list(result.values())
33 |
34 | print("\nSending Message...")
35 |
36 | time.sleep(2)
37 |
38 | if True in list_values:
39 | print("\nMessage Successful")
40 | time.sleep(1)
41 | print("\nText ID: {}".format(list_values[1]))
42 | print("Credits Available: {}".format(list_values[2]))
43 | elif 'Invalid phone number or bad request. If your phone number contains a +, please check that you are URL encoding it properly.' in list_values:
44 | print("\nMessage Failed")
45 | print("\nError: Invalid Phone Number")
46 | elif 'Out of quota' in list_values:
47 | print("\nMessage Failed")
48 | print("\nError: Out of Credits")
49 | else:
50 | print("\nMessage Failed")
51 |
52 | message_2 = input("\nWould you like to send another message? yes/no\n")
53 |
54 | while message_2 == 'yes':
55 | message_updated = input("\nMessage: ")
56 | resp = requests.post('https://textbelt.com/text', {
57 | 'phone': phone_number,
58 | 'message': message_updated,
59 | 'replyWebhookUrl': webhook_url,
60 | 'key': custom_key,
61 | })
62 | result = resp.json()
63 | list_values = list(result.values())
64 |
65 | print("\nSending Message...")
66 |
67 | time.sleep(2)
68 |
69 | if True in list_values:
70 | print("\nMessage Successful")
71 | time.sleep(1)
72 | print("\nText ID: {}".format(list_values[1]))
73 | print("Credits Available: {}".format(list_values[2]))
74 | elif 'Invalid phone number or bad request. If your phone number contains a +, please check that you are URL encoding it properly.' in list_values:
75 | print("\nMessage Failed")
76 | print("\nError: Invalid Phone Number")
77 | elif 'Out of quota' in list_values:
78 | print("\nMessage Failed")
79 | print("\nError: Out of Credits")
80 | else:
81 | print("\nMessage Failed")
82 | print("\nThank you for using Phantom")
83 | message_2 = input("\nWould you like to send another message? yes/no\n")
84 | else:
85 | print(" ")
86 | print(figlet_format("Goodbye", font = "small"))
87 |
88 |
89 |
90 |
91 |
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | requests==2.28.1
2 | pyfiglet==0.8.post1
--------------------------------------------------------------------------------