A trick might be to use the notitlepage option, so \maketitle will not produce a page with the data. Then we can make LaTeX into thinking that \chapter does nothing (note that this is inside an environment, where redefining a command is safe since the redefinition will disappear at the end of the environment; don't do this without enclosing the \renewcommand in a group; it certainly qualifies as a hack):
\documentclass[notitlepage]{report}
\usepackage{lipsum}
\begin{document}
\begin{titlepage}
\thispagestyle{empty}
\title{A draft of my thesis}
\author{A. U. Thor}
\maketitle
\vfill
\begin{abstract}
\lipsum[2]
\end{abstract}
\vfill
\renewcommand{\chapter}[2]{}
\tableofcontents
\vfill
\end{titlepage}
\chapter{Intro}
\lipsum[1]
\end{document}
This works because \tableofcontents does \chapter*{...} and so, redefining \chapter with two arguments to do nothing will ignore the * and the real argument. You'll get no heading for the table of contents; you can add one by
\begin{center}
\bfseries\contentsname
\end{center}
just before \tableofcontents, so that the result will be similar to the abstract's heading.
For a cleaner version one should either use \makeatletter and \makeatother to access \@starttoc (as in lockstep's) answer or patching \tableofcontents with etoolbox. Being this for a quick hack to be used only in preliminary versions, I believe that this is the simplest trick.