TapIt - SMS Phishing Framework
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

143 lines
4.6 KiB

package main
import (
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/postgres"
"log"
"github.com/gorilla/mux"
"io/ioutil"
"net/http"
"os"
"path/filepath"
)
type Tapit struct {
db *gorm.DB
globalSettings GlobalSettings
campaignChan chan CampaignComms
}
type GlobalSettings struct {
secretRegistrationCode string
threadsPerCampaign int
bcryptCost int
maxRequestRetries int
waitBeforeRetry int
}
func generateFileHandler(path string) func(w http.ResponseWriter, r *http.Request) {
return func(w http.ResponseWriter, r *http.Request) {
r.Header.Add("Cache-Control", "private, max-age=604800") // 7 days
//r.Header.Add("Cache-Control", "private, max-age=1") // 1 sec -- debug
http.ServeFile(w, r, path)
}
}
func iterateStatic(r *mux.Router, path string, startWebPath string) {
files, err := ioutil.ReadDir(path)
if err!=nil {
log.Fatal(err)
}
for _, f := range files {
if !f.IsDir() && f.Name()[0] != '.' {
r.HandleFunc(startWebPath + f.Name(), generateFileHandler(path+"/"+f.Name()))
log.Println(startWebPath + f.Name()+" added to path")
} else if f.IsDir() && f.Name()[0] != '.' {
iterateStatic(r, path + "/" + string(f.Name()), startWebPath + string(f.Name() + "/"))
}
}
}
func generateRoutes(r *mux.Router, indexPath string, routes []string) {
for _, route := range routes {
r.HandleFunc(route, generateFileHandler(indexPath))
log.Println(route+" added as route")
}
}
func main() {
// Setting up DB
host := "postgres-tapit"
db, err := gorm.Open("postgres", "sslmode=disable host=" + host + " port=5432 user=tapit dbname=tapit password=secret-tapit-password")
if err != nil {
log.Fatal(err)
}
defer db.Close()
// DB Migrations
db.AutoMigrate(&Session{})
db.AutoMigrate(&User{})
db.AutoMigrate(&TextTemplate{})
db.AutoMigrate(&TwilioProvider{})
db.AutoMigrate(&Phonebook{})
db.AutoMigrate(&PhoneRecord{})
db.AutoMigrate(&Campaign{})
db.AutoMigrate(&Job{})
// Setting up Tapit app
var tapit Tapit
tapit.db = db
tapit.globalSettings.secretRegistrationCode = "Super-Secret-Code"
tapit.globalSettings.threadsPerCampaign = 2
tapit.globalSettings.bcryptCost = 12
tapit.globalSettings.maxRequestRetries = 5
tapit.globalSettings.waitBeforeRetry = 1000
// Clear running campaigns & starting background jobs
tapit.clearRunningCampaigns()
go tapit.workerTwilioChecker()
tapit.campaignChan = make(chan CampaignComms, 10)
// Setting up mux
r := mux.NewRouter()
// Get current dir
dir, err := filepath.Abs(filepath.Dir(os.Args[0]))
if err != nil {
log.Fatal(err)
}
// Setting up static routes (frontend)
iterateStatic(r, dir + "/static/", "/")
routes := []string{
"/",
"/login",
"/register",
"/profile",
"/campaign",
"/campaign/new",
"/campaign/{id}/view",
"/phonebook",
"/phonebook/new",
"/phonebook/{id}/edit",
"/text-template",
"/text-template/new",
"/text-template/{id}/edit",
"/provider",
}
indexPath := dir + "/static/index.html"
generateRoutes(r, indexPath, routes)
// Setting up API routes
r.HandleFunc("/api/login", tapit.login)
r.HandleFunc("/api/logout", tapit.logout)
r.HandleFunc("/api/register", tapit.register)
r.HandleFunc("/api/myself", tapit.authenticationHandler(tapit.myselfHandler))
r.Handle("/api/text-template",tapit.authenticationHandler(tapit.handleTextTemplate))
r.Handle("/api/text-template/{id}",tapit.authenticationHandler(tapit.handleSpecificTextTemplate))
r.Handle("/api/provider/twilio",tapit.authenticationHandler(tapit.handleTwilioProvider))
r.Handle("/api/phonebook",tapit.authenticationHandler(tapit.handlePhonebook))
r.Handle("/api/phonebook/{id}",tapit.authenticationHandler(tapit.handleSpecificPhonebook))
r.Handle("/api/import-phonebook",tapit.authenticationHandler(tapit.importPhonebook))
r.Handle("/api/campaign",tapit.authenticationHandler(tapit.handleCampaign))
r.Handle("/api/campaign/{id}",tapit.authenticationHandler(tapit.handleSpecificCampaign))
r.Handle("/api/campaign/{id}/start",tapit.authenticationHandler(tapit.handleStartCampaign))
r.Handle("/api/campaign/{id}/pause",tapit.authenticationHandler(tapit.handleStopCampaign))
// Starting web server
http.Handle("/", r)
log.Println("Starting web server...")
http.ListenAndServe(":8000", nil)
}